1、如果BEGIN 区块存在,awk执行它指定的动作。 2、awk从输入文件中读取一行,称为一条输入记录。如果输入文件省略,将从标准输入读取 3、awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。字段分隔符使用shell环境变量FS或由参数指定。 4、把当前输入记录(数据行)依次与每一个awk命令中awk条件比较,看是否匹配,如果相匹配,就执行对应的动作。如果不匹配,就跳过对应的动作,直到比较完所有的awk命令。 5、当一条输入记录比较了所有的awk命令后,awk读取输入的下一行,继续重复步骤3和4,这个过程一直持续,直到awk读取到文件尾。 6、当awk读完所有的输入行后,如果存在END,就执行相应的动作。
‘pattern{action}‘
field 字段,列 record 记录,行
空格系列 (单独的空格,连续的空格,tab键)
-F 指定分隔符
-vFS
FS == field sep 每一列的分隔符
OFS ==output field sep 输出每一列的时候使用的分隔符
变量 | 含义 | 英文全写 |
FS | 每一列的分隔符 | field sep |
NF | 每一行有多少列 | number of field |
OFS | 输出每一列的时候使用的分隔符 | output field sep |
NR | 记录号 行号 | number of record |
RS | 每一行的分隔符(每一行的结束标记) | |
$数字 | 取某一列 | |
$0 | 取出这一行 |
$NF 表示最后一列,(NF-1)表示倒数第二列,以此类推。
[root@localhost ~]# awk -F: ‘{print NF}‘ /etc/passwd 7 [root@localhost ~]# awk -F: ‘{print $NF}‘ /etc/passwd /bin/bash /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin ........................... [root@localhost ~]# awk -F: ‘{print $(NF-1)}‘ /etc/passwd /root /bin /sbin ..............
[root@localhost ~]# mkdir /server/files -pv mkdir: 已创建目录 "/server" mkdir: 已创建目录 "/server/files" [root@localhost ~]# cat >>/server/files/reg.txt<<EOF Zhang Dandan 41117397 :250:100:175 Zhang Xiaoyu 390320151 :155:90:201 Meng Feixue 80042789 :250:60:50 Wu Waiwai 70271111 :250:80:75 Liu Bingbing 41117483 :250:100:175 Wang Xiaoai 3515064655 :50:95:135 Zi Gege 1986787350 :250:168:200 Li Youjiu 918391635 :175:75:300 Lao Nanhai 918391635 :250:100:175 EOF
第一列是姓氏
第二列是名字
第一第二列合起来就是姓名
第三列是对应的ID号码
最后三列是三次捐款数量
$2~表示第二列所有的内容。 ~表示所有
在这里X比较特殊,是大写的,awk中区分大小写。
[root@localhost ~]# cd /server/files/ [root@localhost files]# awk ‘$2~/X/‘ reg.txt Zhang Xiaoyu 390320151 :155:90:201 Wang Xiaoai 3515064655 :50:95:135
[root@localhost files]# awk ‘$2~/Xiaoyu/{print $1,$3}‘ reg.txt Zhang 390320151
[root@localhost files]# awk ‘$3~/(1|5)$/{print $1,$2}‘ reg.txt Zhang Xiaoyu Wu Waiwai Wang Xiaoai Li Youjiu Lao Nanhai [root@localhost files]# awk ‘$3~/[15]$/{print $1,$2}‘ reg.txt Zhang Xiaoyu Wu Waiwai Wang Xiaoai Li Youjiu Lao Nanhai
先找到,再进行输出。(NF-1) 表示倒数第二列。
[root@localhost files]# awk -F "[ :]+" ‘$1~/Zhang/{print $2,$(NF-1)}‘ reg.txt Dandan 100 Xiaoyu 90
tr 命令进行替换,格式比较简单tr "要替换什么" "替换成什么"
[root@localhost files]# awk ‘$2~/Xiaoyu/{print $4}‘ reg.txt |tr ":" "$" $155$90$201 [root@localhost files]# awk ‘$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}‘ reg.txt $155$90$201
$0表示文件中整条记录(行)的内容,在这里加$0 与不加$0 相同。
[root@localhost files]# awk ‘/Zhang/‘ reg.txt Zhang Dandan 41117397 :250:100:175 Zhang Xiaoyu 390320151 :155:90:201 [root@localhost files]# awk ‘$0~/Zhang/‘ reg.txt Zhang Dandan 41117397 :250:100:175 Zhang Xiaoyu 390320151 :155:90:201
在awk中,可以用来替换的有三个函数:sub gsub gensub
gsub(r, s [, t])
r /找谁/ s "替换成什么" [] 替换那个部分的 表示为: gsub(/找谁/,"替换成什么",替换那个部分的)
题目:显示Xiaoyu的捐款.每个值时都有以$开头.如520520200$135
中间使用分号分割 ;
[root@localhost files]# awk ‘{gsub(/:/,"$",$NF);print $0}‘ reg.txt Zhang Dandan 41117397 $250$100$175 Zhang Xiaoyu 390320151 $155$90$201 Meng Feixue 80042789 $250$60$50 Wu Waiwai 70271111 $250$80$75 Liu Bingbing 41117483 $250$100$175 Wang Xiaoai 3515064655 $50$95$135 Zi Gege 1986787350 $250$168$200 Li Youjiu 918391635 $175$75$300 Lao Nanhai 918391635 $250$100$175
添加上限定条件后,取到的结果会更加的精确。
[root@localhost files]# awk ‘$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}‘ reg.txt $155$90$201
不包含:!,在awk中不包含可以使用! 表示。
$NF 表示这个文件的最后一列
-F 将分隔符指定为:
[root@localhost files]# awk -F: ‘$NF!~/nologin$/{print $1}‘ /etc/passwd root sync shutdown halt
-t -t参数让他对齐。
[root@localhost files]# awk ‘BEGIN{print "姓","名"}{print $1,$2}‘ reg.txt |column -t
姓 名
Zhang Dandan
Zhang Xiaoyu
Meng Feixue
Wu Waiwai
Liu Bingbing
Wang Xiaoai
Zi Gege
Li Youjiu
Lao Nanhai
BEGIN:开始
里面的内容会在awk读取文件之前运行
在BEGIN里面定义awk的内置变量
END
END{} 里面放入内容,在读取完文件内容后执行
先计算,在END里面输出结果
先计算再输出
[root@localhost files]# awk ‘{print $0}END{print "结束"}‘ reg.txt Zhang Dandan 41117397 :250:100:175 Zhang Xiaoyu 390320151 :155:90:201 Meng Feixue 80042789 :250:60:50 Wu Waiwai 70271111 :250:80:75 Liu Bingbing 41117483 :250:100:175 Wang Xiaoai 3515064655 :50:95:135 Zi Gege 1986787350 :250:168:200 Li Youjiu 918391635 :175:75:300 Lao Nanhai 918391635 :250:100:175 结束
前面的i++先进行计算,再输出结果。
i=i+1 与i++ 相同。
[root@localhost files]# awk ‘/^$/{i=i+1}END{print i}‘ /etc/services 17 [root@localhost files]# awk ‘/^$/{i++}END{print i}‘ /etc/services 17
i++与i=i+1相同。
i=i+$0 累计相加 计算总和
i=i+1 i++ 计数
[root@localhost files]# awk ‘/^$/{i++;print i}‘ /etc/services 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
uniq -c uniq 命令把相邻两行一样的合并,-c为统计出现的次数
[root@localhost files]# awk ‘/^$/‘ /etc/services|uniq -c 17 [root@localhost files]# awk ‘/^$/‘ /etc/services|wc -l 17
原文:https://www.cnblogs.com/liujunjun/p/11963931.html