awk
【功能】
用于处理文本,擅长取行;取列
【语法】
awk +参数 文件
【参数】
参数选项 |
解释说明(带※的为重点) ***** |
NR== |
代表行数分为 (1 2 3 4......) '{print NR}' 默认是行数 |
$(NF-1) |
倒数第二行 |
-F |
指定分隔符默认为空格(同时可以指定多把菜刀) |
-v |
v 左边是要修改变量的名字,右边是修改成的的名字 OFS 内置变量 |
-vOFS |
修改自带变量 |
"[, ]" |
指定多把菜刀 |
! |
取反 |
NF |
代表行尾,最后一列 |
$ |
代表列 1....... |
END |
awk 'END{ print NR }' 文件可以显示行数 |
> ; < |
|
+ |
把连续出现的合并成一个 |
. |
任意字符 |
* |
所有 |
BEGIN |
awk 'BEGIN{print 10*2}' 计算机 20 |
(NR%2) |
基数行 |
!(NR%2) |
偶数行 |
BEGIN |
优先执行 |
END |
最后执行 |
环境1:cat xiaojiang
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
环境:2 ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:31:15:26 inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0
环境三
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
实例1
1.1 说明:取第二行
awk NR==2 xiaojiang bin:x:1:1:bin:/bin:/sbin/nologin
实例2
1.2 说明:打印行号
awk '{print NR $0}' xiaojiang 1root:x:0:0:root:/root:/bin/bash 2bin:x:1:1:bin:/bin:/sbin/nologin 3daemon:x:2:2:daemon:/sbin:/sbin/nologin
实例3
1.3 说明:取第一行;第三列
awk -F ":" 'NR==1{print $3}' xiaojiang
实例4
1.4 说明:指定 :空格为分隔符,+表示把连续出现的合为一个
方法一:ifconfig|awk -F "[: ]+" 'NR==2{print $4}' 10.0.0.200 方法二:ifconfig|awk -F "[: B]+" 'NR==2{print $4}' 10.0.0.200
实例5
1.5 说明:显示多少行,和大于几行的内容
awk 'END{ print NR }' xiaojiang
3
awk 'NR >2{print $0}' p 查看大于第二行的以外的内容
实例6
1.6 说明:取反(取出不是以r开头的行)
awk '!/^r/' xiaojiang
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
实例7
1.7 说明:取出以?开头?结尾的行
awk '/^r.*h$/' xiaojiang
awk '/^lp/,/^ma/' passwd.txt 从哪里来到哪了去
root:x:0:0:root:/root:/bin/bash
实例8
1.8 说明:调换顺序,追加到新文件里
awk -F ":" 'NR==1{print $NF";"$2";"$3";"$4";"$5";"$6";"$1}' xiaojiang
/bin/bash;x;0;0;root;/root;root
实例9
1.9 说明:找出空行
awk "/^$/" xiaojiang
实例10
1.10 说明:-vOFS变量说明
前言介绍,方便理解:
[root@oldboyedu-39-nb ~]# echo 1 2 3
1 2 3
echo 1 2 3 |awk -vOFS="@@@" '{print $1,$2,$3}'
1@@@2@@@3
例子:
awk -F ":" -v OFS=":" '{print $NF,$2,$3,$4,$5,$6,$1}' passwd
echo 1 2 3 4 5 6|awk '{a=$1;$1=$6;$6=a;print $0}'
6 2 3 4 5 1
1.11 (\S和\s的用法) 排除文本中的空白显示/etc/inittab中以#开头,且后面跟了一个或者多个空白字符,而后又跟了任意非空白字符的行
awk '/^#\s+\S+/' /etc/inittab
1.12 查找偶数行和技数行,和计算行数
awk '(NR%2)' a 基数行
awk '!(NR%2)' a 偶数行
awk -F -vi=0 '{if(NR%2!=1){i=i+NR}}END{print i}' a (计算偶数行,是行号加起来的数)
awk -F -vi=0 '{if(NR%2){i=i+NR}}END{print i}' a 奇数行总行数
1.13 显示最后一列包含sbin/nologin的行
awk '$NF~/nologin$/' passwd.txt
1.14 显示文件的第20到30行
awk 'NR==2,NR==5' passwd.txt
1.14.1 显示Xiaoyu的姓氏和ID 号码
awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
1.15 显示是Zhang的行和他的第二次捐款金额及他的名字
awk -F "[: ]+" '$1~/Zhang/{print $1,$2,$(NF-1)}' reg.txt
1.16 显示以41开头的ID号码的人的全名和ID号码
awk '$3~/^41/{print $1,$2,$3}' reg.txt
1.17 显示以1和5结尾的行 查看行
awk '$3~/[15]$/' reg.txt
awk '$3~/1|5$/{print $1,$2}' reg.txt
awk '$3~/(1|5)$/{print $1,$2}' reg.txt
1.18 显示把:换成$ 修改分割符
awk '$2~/Xiaoyu/{print $NF}' reg.txt |tr ":" "$"
awk -F "[ :]+" '$2~/Xiaoyu/{print "$"$4,"$"$5,"$"$6}' reg.txt
awk -F '[ :]+' -vOFS="$" '$2~/Xiaoyu/{print OFS$4,$5,$6}' reg.txt
awk '{gsub(/:/,"$",$NF); print $0}' reg.txt
原来是什么 要替换成什么 在哪里替换
1.19 BEGIN用法
awk 'BEGIN{print "姓氏","名字"}{print $1,$2}' reg.txt
姓氏 名字
Zhang Dandan
Zhang Xiaoyu
1.20 GIN用法
awk '{print $1,$2};END{print "结束了"}' reg.txt
Zhang Dandan
Lao Nanhai
结束了
1.21 计算出现次数 sort|uniq -c|sort -rnk2
i=i+1======i++ i=i+10===i+=10
方法一:awk '/250/{print $NF}' reg.txt|sort|uniq -c|sort -rnk2
方法二:awk '/250/{i=i+1;print i}' reg.txt
方法三:grep -c '250' reg.txt
方法四:awk '/250/{++i}END{print i}' reg.txt
1.22 修改换行符
awk '{print $0,RS}' ppppp 显示换行符浩
awk 'BEGIN{RS="/"}{print NR $0}' ppppp 修改换行符
1.23 awk替换 gsub
awk '{gsub(/:/,"$",$NF); print $0}' reg.t
1.24 查看文件有多少行
awk '{print NF}' /tmp/user.txt
1.25 找出文件中只有一列的行
awk 'NR>1{if (NF<2) print $0}' test.txt