Linux工具-awk
参考文献
AWK
- awk是逐行处理的,逐行处理的意思就是说,当awk处理一个文本时,会一行一行进行处理,处理完当前行,再处理下一行,awk默认以”换行符”为标记,识别每一行,也就是说,awk跟我们人类一样,每次遇到”回车换行”,就认为是当前行的结束,新的一行的开始,awk会按照用户指定的分割符去分割当前行,如果没有指定分割符,默认使用空格作为分隔符。
内建变量
变量 | 说明 |
---|---|
$0 |
当前记录(这个变量中存放着整个行的内容) |
$1~$n |
当前记录的第n 个字段,字段间由FS 分隔 |
FS |
输入字段分隔符 默认是空格或Tab |
NF |
Number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量 |
NR |
行号,当前处理的文本行的行号 |
FNR |
各个文件自己的行号 |
RS |
输入的记录分隔符, 默认为换行符 |
OFS |
输出字段分隔符, 默认也是空格 |
ORS |
输出的记录分隔符,默认为换行符 |
FILENAME |
当前输入文件的名字 |
ARGC |
命令行参数的个数 |
ARGV |
数组,保存的是命令行所在给定的各个参数 |
awk
脚本
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
1 | $ cat cal.awk |
环境变量
-
使用
-v
参数和ENVIRON
,使用ENVIRON
的环境变量需要export
1
2
3
4
5
6
7
8
9$ x=5
$ y=10
$ export y
$ echo $x $y
5 10
$ awk -v val=$x '{print $1, $2, $3, $4+val, $5+ENVIRON["y"]}' OFS="\t" score.txt
示例
输出文本的第一列和第四列
1 | awk '{print $1,$4}' netstat.txt |
按指定格式输出
1 | awk '{prinf "%-8s %-8s %-8s %-20s %-20s %-20s\n",$1,$2,$3,$4,$5,$6}' netstat.txt |
%-ns
表示输出字符串占用 n个字符的位置
根据条件过滤记录
1 | awk '$3==0 && $6=="TIME_WAIT"' netstat.txt |
指定分隔符
1 | awk 'BEGIN{FS=","} {print $1,$2,$5}' netstat.txt |
1 | # 指定多个分隔符 |
1 | # 指定输出分隔符 |
字符串匹配
1 | # 输出含有TIME_WAIT字样的记录 |
正则表达式匹配
1 | # ~ 表示模式开始。/ /中是模式 |
1 | # 取反 |
拆分文件
1 | awk 'NR!=1{print > $6}' netstat.txt |
NR!=1
表示不处理表头
1 | # 把指定的列输出到文件 |
1 | # |
统计
1 | # 计算所有的C文件,CPP文件和H文件的文件大小总和 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HoleLin's Blog!