awk:报告生成器(不修改文本,只是提取信息)
一些重要参数
- 行 record
- 列 field
- NR number of record
- NF number of field 每行有几列
awk '{print $1}' file # 打印文件里一列,以空格为分割的
awk '{print $NF}' file # 打印文件里最后列
awk '{print $(NF-1)}' file # 打印文件里倒数第二列,不加括号就是NF的值减一
列对齐 “\t”
awk '{print $1, "\t", $2, "\t", $3}' file
awk默认把空格当作字符拼接符,逗号则是默认分隔符
awk '{print $1, $2, $3}' file # 逗号把每一列隔开(一个空格)
awk '{print $1 $2 $3}' file # 空格把每一列拼接在一起
echo 1:2 3*4 | awk -F: '{print $1}' # 用-F指定那个是分隔符
echo 1:2 3*4 | awk -F" " '{print $(NF-1)}' # 用-F指定那个是分隔符(双引号中的是分隔符)
显示行数
awk '{print NR "\t" $0}' awk.file # $0表示所有的列
显示列数
awk '{print N "\t" $0}' awk.file # $0表示所有的列
显示2012年入职的员工(有条件的提取信息)
awk '$2=="2012"{print $0}' staff.txt # ==两个等于号表示匹配
只打印每行的列数
awk '{print NF}' staff.txt
只打印行号
awk '{print N}' staff.txt
只打印第三行
awk 'NR=="3"{print NR, $0}' staff.txt
只打印第五列
awk 'NF=="5"{print $0}' staff.txt
如果不输入文件名,系统会等待输入!只能Ctrl+C取消
自定义分隔符
awk 'BEGIN{FS=","}{print $1}'
BEGIN表示全局变量,FS表示当前分隔符
awk默认的输入分隔符和输出分隔符是分别定义的, 默认的时候都是空格。
awk 'BEGIN{FS=",";OFS=","}{print $1, $2}'
两个文件同时打印行号和某列,则会合并显示(文件2内容追加在文件1下面)
awk '{print NR, $1}' satff.txt awk.txt
输出的时候同时输出文件名
awk '{print NR, FILENAME, $0}' satff.txt awk.txt
awk '{print NR, "\t", FILENAME, "\t", $0}' satff.txt awk.txt
隐藏某一列的内容
awk '{$3="XXXX"; print $0}' staff.txt
由于awk不会修改文件内容,可用
>
覆盖或
>>
追加到某文件
awk '{$3="XXXX"; print $0}' staff.txt > result
more result
把result的内容用awk来处理并显示
awk '{$3="XXXX"; print $0}' staff.txt < result
输入内容并用awk来处理和显示,END是输入的结束符
awk '{$3="XXXX"; print $0}' staff.txt << END
awk做计算
awk '{a=1; b=3; print a+b}'
此时会等待输入,由于我们已经输入好了,所以直接回车,awk会给出显示结果
awk计算时遇到字符,从左到右遇到数字进行匹配,遇到字符就停止,若第一个为字符,则直接忽略掉
awk '{a=1d888sa; b=333dsgh654; print a+b}' # 结果是334
版权声明:本文为bigplipli原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。