用户工具

站点工具


linux三剑客:awk

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

linux三剑客:awk [2022/07/13 21:29] (当前版本)
pwbty 创建
行 1: 行 1:
 +====== awk介绍 ======
 +
 +awk 擅长对列进行操作/进行数据信息的统计
 +
 +作用特点:
 +
 +  - 排除信息
 +  - 查询信息
 +  - 统计信息
 +  - 替换信息
 +
 +语法格式:
 +
 +awk [参数] ‘模式-动作’ 文件
 +
 +====== 查询方法 ======
 +
 +命令:
 +
 +^-F^定义分隔符^
 +|-v|设置变量 |
 +|NF|最后一列 |
 +
 +$符号用法:
 +
 +^符号      ^用法     ^
 +|$1 $2 $3|取对应列   |
 +|$NF     |最后一列   |
 +|$(NF-n) |取倒数第几列 |
 +|$0      |取所有列的信息|
 +
 +===== 按单多行查询 =====
 +
 +单行NR==,多行区间用”,“,指定行之间分隔用”;
 +
 +<code shell>
 +#查询第二行
 +awk 'NR==2' awk_test.txt
 +#查询二到六行
 +awk 'NR==2,NR==6' awk_test.txt
 +#查询第二行和第六行
 +awk 'NR==2;NR==6' awk_test.txt
 +</code>
 +
 +===== 字符查询 =====
 +
 +多行查询同行查询,“,”与”;
 +
 +<code>
 +awk '/Xiaoyu/' awk_test.txt
 +</code>
 +
 +===== 字符筛选 =====
 +
 +筛选结果之间的连接符号
 +
 +<code>
 +awk '/Xiaoyu/{print $1,$3}' awk_test.txt
 +Zhang 390320151
 +awk '/Xiaoyu/{print $1","$3}' awk_test.txt
 +Zhang,390320151
 +</code>
 +
 +指定分隔符”-F”
 +
 +<code>
 +awk -F ":" '/^Zhang/{print $3}' awk_test.txt 
 +</code>
 +
 +如果行中同时存在多个不同分隔符-F” :”
 +
 +<code>
 +#Zhang    Dandan        41117397    :250:100:175
 +awk -F "[ :]+" '/^Zhang/{print $1,$2,$5}' awk_test.txt
 +#取倒数第二列$(NF-1)
 +awk -F "[ :]+" '/^Zhang/{print $1,$2,$(NF-1)}' awk_test.txt
 +</code>
 +
 +在某列中筛选,输出其他列信息
 +
 +<code>
 +#显示所有以41开头的ID号码的人的全名和ID号码
 +#在第三列中匹配41开头的结果,并显示第1,2,3列信息
 +awk '$3~/^41/{print $1,$2,$3}' awk_test.txt
 +#显示所有ID号码最后一位数字是1或5的人的全名
 +awk '$3~/1$|5$/{print $1,$2}' awk_test.txt
 +awk '$3~/[15]$/{print $1,$2}' awk_test.txt|column -t
 +awk '$3~/(1|5)$/{print $1,$2}' awk_test.txt|column -t
 +</code>
 +
 +====== 替换方法 ======
 +
 +gsub(/需要替换的信息/,“修改成什么信息”,将哪列信息进行修改)
 +
 +在print之前,先替换,再输出
 +
 +<code shell>
 +#显示Xiaoyu的捐款,每个捐款数值前面都有以$开头, 如$110$220$330
 +awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt
 +</code>
 +
 +====== awk高级功能说明 ======
 +
 +===== awk模式概念 =====
 +
 +匹配的条件信息
 +
 +==== 普通的模式: ====
 +
 +  * 正则表达式作为模式
 +
 +<code>
 +awk '/^oldboy/{print xx}'
 +</code>
 +
 +  * 利用比较匹配信息
 +
 +<code>
 +NR==2
 +NR>=2
 +NR<=2
 +</code>
 +
 +==== 特殊的模式 ====
 +
 +=== BEGIN{}在awk执行命令前做什么 ===
 +
 +  * 增加标题
 +
 +<code>
 +awk 'BEGIN{print "姓名","QQ号","记录"}{print $0}' awk_test.txt | column -t
 +</code>
 +
 +  * 修改内置分隔符变量
 +
 +<code>
 +awk 'BEGIN{FS=":"}{print $2}' awk.txt
 +</code>
 +
 +=== END{}在命令结束后进行的操作 ===
 +
 +最后显示信息
 +
 +<code>
 +awk 'BEGIN{print "姓名","QQ号","记录"}{print $0}END{print "操作结束"}' awk.txt|column -t
 +</code>
 +
 +统计空行
 +
 +<code>
 +awk '/^$/{i++}END{print i}' /etc/services
 +</code>
 +
 +统计系统中多少普通用户,虚拟用户
 +
 +<code>
 +#普通用户
 +awk '$NF~/\/bin\/bash/{i++}END{print i' /etc/passwd
 +#虚拟用户,取反即可
 +awk '$NF!~\/bin\/bash/{i++}END{print i}' /etc/passwd
 +</code>
 +
 +求和运算
 +
 +<code>
 +seq 10 |awk '{sum=sum + $1;print sum}'
 +</code>
 +
 +===== 内置变量 =====
 +
 +^变量名^英文              ^意义       ^
 +|FS |field separator |字段分隔符变量  |
 +|NR |number records  |表示行号信息   |
 +|NF |number of fields|表示每一行有多少列|
  
linux三剑客/awk.txt · 最后更改: 2022/07/13 21:29 由 pwbty