awk命令:报告生成器(不修改文本,只是提取信息)

  • Post author:
  • Post category:其他




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 版权协议,转载请附上原文出处链接和本声明。