热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

awk从入门至放弃

什么是awk?awk:Aho,Weinberger,Kernighan,报告生成器,格式化文本输出有多种版本:Newawk(nawk),GNUawk(gawk)gawk:模式扫描的

什么是awk?
awk:Aho,Weinberger,Kernighan,报告生成器,格式化文本输出
有多种版本:New awk(nawk),GNU awk(gawk)
gawk:模式扫描的处理语言
基本用法:
awk [options] ‘program‘ var=value file...
awk [POSIX or GNU style options] -f programfile [--] file ...

基本格式:
awk [options] ‘program‘ file...
program:pattern{action statements;...}
读入文件一行,检查是否符合pattern,是就执行action statments
BEGIN:没有读取文件前,先执行BEGIN
END:读取完成文件后,执行END
省略action,则默认执行 print $0 的操作
在{}中,$1 $2要用,才可以分割,用空格不行,可以用"\t"
分割符:
读入行分割成$1 $2,默认是空格,不管几个空格都压缩成一个,-F设置分隔符
域:
行的所有字段$0为所有域
记录:
文件的每一行称为记录,可以把多选,一行中的一部分作为记录,可以利用-v RS=“”来定义记录分隔符

-F 列分隔符
-v 变量赋值,变量可以延伸到下一行
FS=":" 列分隔符,FS=$PATH,可以引用shell中的变量 field space
awk -v FS=$S ‘{pirnt $1,$3}‘ /etc/passwd
OFS=":" 输出时列分隔符
awk -v OFS=*** ‘{print $1OSF$3}‘ /etc/passwd
RS="" 输入记录分隔符,指定输入时的换行符 record space
awk -v RS="" ‘‘
ORS="" 输出记录分隔符,指定时不用在action中引用有有
awk -v ORS=""
自定义变量:
awk -v var=123
awk -F: ‘{title="hello"; print $1,title}‘ /etc/passwd
NF 字段数 number field
awk -F: ‘{print NF}‘ /etc/passwd
awk -F: ‘{print $NF}‘ /etc/passwd 最后一段
awk -F: ‘{print $(NF-1)}‘ /etc/passwd 倒数第二段
NR 记录数 number record
awk -F: ‘{print NR,$1}‘ /etc/passwd 打印第一行的行号
FNR 各文件分别计数,记录号
awk ‘{print FNR}‘ /etc/fstab /etc/inittab
FILENAME 当前文件名
awk ‘{print FILENAME}‘ /etc/fstab
ARGC 命令行参数的个数
awk ‘{print ARGC}‘ /etc/fstab
ARGV 数组,保存的是命令行所给定的各参数
awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
-f awkScript
使用扩展正则表达式来定义-F后的分隔符
df | grep "/dev/sd" | awk -F"[[:space:]]+|%" ‘{print $5}‘ (以多个连续空格或%为分隔符)
![](https://s1.51cto.com/images/blog/201904/13/84d9d679c39c027aa452d3a4dea80eb1.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
df | awk -F" +|%" ‘/^\/dev\/sd/{print $1,$5}‘
![](https://s1.51cto.com/images/blog/201904/13/fde44b4f735edf5c63a437d4b247b1b9.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

printf命令
printf "FORMAT",item1,item2,...
1、必须指定FORMAT
2、不会自动换行,需要显示给出换行控制符,\n1
3、FORMAT中需要分别为后面每个item指定格式符
格式符:与item一一对应
%c:显示字符的ASCII码
%d, %i:显示十进制整数
%e, %E:显示科学计数法数值
%f:%.2f,右对齐%10.2f,右对齐%-10.2f,显示为浮点数
%g, %G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%自身
修饰符
#[.#] 第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f


  • 左对齐(默认右对齐) %-15s

  • 显示数值的正负符号 %+d
    echo "100.123" | awk ‘{printf "The is a %d"kk,$0}‘
    awk的操作符
    算术操作符:x+y x%y +x -x
    字符串操作符:没有符号的操作符,字符串连接
    赋值操作符:= += -= *= /= %= ^= ++ --
    比较操作符:==, !=, >, >=, <, <=
    模式匹配符:~ !~
    awk -F: ‘$3 ~ /107/{print $1}‘ /etc/passwd 匹配第3列中等于107的行的用户名
    技术分享图片
    df | awk ‘$0 ~ "^/dev/sd" {print $0}‘ 打印匹配df命令以^/dev/sd开头的行
    技术分享图片
    逻辑操作符:与&&,或||,非!
    awk -F: ‘$3>=0 && $3<=1000 {print $1}‘ /etc/passwd
    技术分享图片
    awk -F: ‘$3==0 || $3>=1000 {print $1}‘ /etc/passwd
    技术分享图片
    awk -F: ‘!($3==0) {print $1}‘ /etc/passwd
    技术分享图片
    条件表达式(三目表达式)
    selector?if-true-expression:if-false-expression
    awk -F: ‘{$3>=1000?usertype="Common User":usertype=" SysUser";printf "%15s:%-s\n",$1,usertype}‘ /etc/passwd
    技术分享图片
    PATTERN:根据pattern条件,过滤匹配的行,再做处理
    (1)如果未指定:空模式,匹配每一行
    (2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
    awk ‘/^UUID/{print $1}‘ /etc/fstab
    awk ‘!/^UUID/{print $1}‘ /etc/fstab
    (3) relational expression: 关系表达式,结果为“真”才会被处理
    只要是awk -F: ‘""{print $1,$3}‘ /etc/passwd中{print $1,$3}前""是空就是,只要有内容都是真
    字符串不空为真,数值不为0为真
    真:结果为非0值,非空字符串
    假:结果为空字符串或0值
    (4) line ranges:行范围
    startline,endline:/pat1/,/pat2/ 不支持直接给出数字格式
    awk -F: ‘/^root\>/,/^nobody\>/{print $1}‘ /etc/passwd
    awk -F: ‘(NR>=10&&NR<=20){print NR,$1}‘ /etc/passwd
    seq 10 | awk ‘NR>2;NR<=5‘
    打印全部行,且3 4 5 打印两遍
    (5) BEGIN/END模式
    BEGIN{}:仅在开始处理文件中的文本之前执行一次
    END{}:仅在文本处理完成之后执行一次

    seq 10 | awk ‘i=0‘ 这个awk是默认省略了{print $0}
    seq 10 | awk ‘i=!i‘ 1、对空i取反为非空,打印 2、对非空i取反,不打印,这样循环,打印奇数行
    seq 10 | awk ‘!(i=!i)‘

    常用的action分类
    ?(1) Expressions:算术,比较表达式等
    ?(2) Control statements:if, while等
    ?(3) Compound statements:组合语句
    ?(4) input statements
    ?(5) output statements:print等

    { statements;… } 组合语句
    ?if(condition) {statements;…}
    ?if(condition) {statements;…} else {statements;…}
    ?while(conditon) {statments;…}
    ?do {statements;…} while(condition)
    ?for(expr1;expr2;expr3) {statements;…}
    ?break
    ?continue
    ?delete array[index]
    ?delete array
    ?exit

    if-else语句
    awk -F: ‘{if($3>=1000)print $1,$3}‘ /etc/passwd
    awk -F: ‘{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}‘ /etc/passwd
    df -h|awk -F% ‘/^\/dev/{print $1}‘|awk ‘$NF>=80{print $1,$5}‘

    while语句
    awk ‘/^[[:space:]]linux16/{i=1;while(i<=NF){print $i,length($i); i++}}‘ /etc/grub2.cfg
    awk ‘/^[[:space:]]
    linux16/{i=1;while(i<=NF) {if(length($i)>=10) {print $i,length($i)}; i++}}‘ /etc/grub2.cfg

    do-while语句
    awk ‘BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}‘

    for循环语句
    语法:for(expr1;expr2;expr3) {statement;…}
    awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}‘ /etc/grub2.cfg

    switch语句
    语法:switch(expression) {case VALUE1 or /REGEXP/: statement1; case VALUE2 or /REGEXP2/: statement2; ...; default: statementn}
    break和continue
    awk ‘BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0)continue;sum+=i}print sum}‘
    awk ‘BEGIN{sum=0;for(i=1;i<=100;i++){if(i==66)break;sum+=i}print sum}‘

    awk ‘!line[$0]++‘ fl.txt 忽略重复行,第一次f1.txt的第一行为line["123"]为空,line["123"]++=line["123"]=1
    awk ‘!line[$0]++{pirint $0 line[$0]}‘ f1.txt 查看
    awk ‘{!line[$0]++; pirint $0 line[$0]}‘ f1.txt

    awk数组
    关联数组:array[index-expression]
    index-expression
    (1)、可使用任意字符串,字符串要使用双引号括起来
    (2)、如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将某值初始化为"空串"
    (3)、若要判断数组中是否存在某元素,要使用"index in array",格式进行遍历
    若要遍历数组中的每个元素,可使用for循环
    for(var in array) {for-body}
    注意:var会遍历array的每个索引
    awk‘BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday"; for(i in weekdays) {print weekdays[i]}}‘
    netstat -tan | awk ‘/^tcp/{state[$NF]++}END{for(i in state) { print i,state[i]}}‘
    awk ‘{ip[$1]++}END{for(i in ip) {print i,ip[i]}}‘ /var/log/httpd/access_log

    利用函数求男女的平均数
    name score gender
    a 100 m
    b 99 f
    c 80 f
    awk ‘NR!=1{sum[$3]+=$2;num[$3]++}END{for(i in sum)print i,num[i];or(i in sum)print i,num[i];}‘

    函数
    rand():返回0和1之间的一个随机数
    srand()有种子才能造成随机数
    awk ‘BEGIN{srand();print rand()}‘
    awk ‘BEGIN{srand();print int(rand()*100)}‘
    字符串处理:
    length([s]):返回指定字符串的长度
    sub(r,s,[t]):对t字符串搜索r表示模式匹配的内容,并将第一个匹配内容替换为s
    echo "2008:08:08 08:08:08" | awk ‘sub(/:/,"-",$1)‘
    gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
    split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,…
    array[1]切割的第一列,array[2]切割后...
    ss -tn | awk ‘/^ESTAB{split($NF,ip,":");count[ip[1]]++};END{for(i in count)print i,count[i]}‘
    自定义函数
    格式:
    function name ( parameter, parameter, ... ) {
    statements
    return expression
    }
    ?示例:
    cat fun.awk
    function max(x,y) {
    x>y?var=x:var=y
    return var
    }
    BEGIN{a=3;b=2;print max(a,b)}
    awk -f fun.awk
    调用shell中的命令
    awk ‘BEGIN{system("hostname")}‘
    awk ‘BEGIN{score=100;system("echo your score is " score)}‘



推荐阅读
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
author-avatar
扩散平衡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有