课题研究常用方法 文本分析
Awk是一个流编辑器,它对文档中的行进行操作,并逐行执行它们 。Awk可以非常方便高效的操作文档和字符,从而实现我们想要的格式 。它的功能非常强大,我经常在shell脚本中使用它来处理字符串 。以下是awk在工作中经常用到的几种用法 。
1.截取文件中的一段 。例子如下:
# head -n2 test.txt |awk -F \':\' \'{print $1}\'rootbin
在本例中,-F选项用于指定分隔符 。如果没有添加-F选项,则使用空或tab作为分隔符 。打印是打印的动作,用来打印一个字段 。是第一个字段,是第二个字段,依此类推 。但是[6]是特殊的,它表示整行:
# head -n2 test.txt |awk -F\':\' \'{print $0}\'root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin
注意awk的格式,-F后面是单引号,分隔符在单引号里面 。print的动作应该用{}括起来,否则会报错 。Print也可以打印自定义内容,但是自定义内容应该用双引号括起来,如下所示:
# head -n2 test.txt |awk -F \':\' \'{print $1\"#\"$2\"#\"$3\"#\"$4}\'root#x#0#0bin#x#1#1
2.匹配字符或字符串过滤掉文档中包含指定字符串的行 。示例命令如下:
# awk \'/oo/\' test.txtroot:x:0:0:root:/root:/bin/bashlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0perator:/root:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin setroubleshoot:x:992:990::/var/lib/setroubleshoot:/sbin/nologin
这类似于sed的用法 。可以实现grep的功能,但是没有彩色显示 。当然没有grep方便 。但是,awk比sed具有更强的匹配性,如下所示:
# awk -F \':\' \'$1 ~/oo/\' test.txtroot:x:0:0:root:/root:/bin/bashsetroubleshoot:x:992:990::/var/lib/setroubleshoot:/sbin/nologin
它可以进行某段匹配,其中~表示匹配 。
此外,awk可以匹配多次,如下所示:
# awk -F \':\' \'/root/ {print $1,$3} /test/ {print $1,$3}\' test.txtroot 0operator 11test 1006
在这个例子中,awk匹配root,然后匹配test,并且只打印匹配的段 。
3.条件运算符有时候匹配字符的时候要给一个限定条件,比如第三段的0 。例子如下:
# awk -F \':\' \'$3==\"0\"\' /etc/passwdroot:x:0:0:root:/root:/bin/bash
在awk中,我们可以用逻辑符号进行判断,比如= = equals,也可以理解为精确匹配 。另外,还有>,> =,,!=等等 。值得注意的是,在与数字进行比较时,如果要比较的数字是用双引号括起来的,awk就不会认为是数字,而是字符,会认为是没有双引号的数字 。例子如下:
# awk -F \':\' \'$3>=\"500\"\' /etc/passwd |head -n 5shutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinnobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologin
在这个例子中,Amin想要打印uid大于或等于500的行,但是结果并不令人满意 。这是因为awk把所有的数字都当作字符,就像上一章提到的sort排序原理一样 。但是,如果不添加双引号,就会得到想要的结果:
# awk -F \':\' \'$3>=500\' /etc/passwd|head -n 5nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologinsystemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologinpolkitd:x:998:996:User for polkitd:/:/sbin/nologingeoclue:x:997:995:User for geoclue:/var/lib/geoclue:/sbin/nologinunbound:x:996:991:Unbound DNS resolver:/etc/unbound:/sbin/nologin# awk -F \':\' \'$7!=\"/sbin/nologin\"\' /etc/passwdroot:x:0:0:root:/root:/bin/bashsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltaminglinux:x:1000:1000:aminglinux:/home/aminglinux:/bin/bash
在上面的例子中!=表示不匹配,除了可以对某个段的字符进行逻辑比较之外,还可以对两个段进行逻辑比较 。如下所示:
# awk -F \':\' \'$3
或者,您可以使用& &和||,它们分别代表“与”和“或” 。& &的用法如下:
# awk -F \':\' \'$3>\"5\" && $3
||的用法如下:
# awk -F \':\' \'$3>1000 || $7==\"/bin/bash\"\' /etc/passwdroot:x:0:0:root:/root:/bin/bashnobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologinaminglinux:x:1000:1000:aminglinux:/home/aminglinux:/bin/bash
4.awk的内置变量Awk常用的变量有OFS、NF和NR 。选项OFS和-F具有相似的功能,也用于定义分隔符,但它们是在输出时定义的 。NF表示有多少数据段被分隔符分隔开 。NR代表行号 。
OFS的用法举例如下:
# head -5 /etc/passwd |awk -F \':\' \'{OFS=\"#\"} {print $1,$3,$4}\'root#0#0bin#1#1daemon#2#2adm#3#4lp#4#7
还有更高级的用途:
# awk -F \':\' \'{OFS=\"#\"} {if ($3>=1000) {print $1,$2,$3,$4}}\' /etc/passwdnobody#x#65534#65534aminglinux#x#1000#1000
变量NF的具体用法如下:
# head -n3 /etc/passwd | awk -F \':\' \'{print NF}\'777# head -n3 /etc/passwd | awk -F \':\' \'{print $NF}\'/bin/bash/sbin/nologin/sbin/nologin
【课题研究常用方法 文本分析】这里NF是多少段,$NF是最后一段的值 。NR变量的具体用法如下:
# head -n3 /etc/passwd | awk -F \':\' \'{print NR}\'123
我们也可以用NR作为判断条件,如下:
# awk \'NR>40\' /etc/passwdinsights:x:978:976:Red Hat Insights:/var/lib/insights:/sbin/nologinsshd:x:74:74rivilege-separated SSH:/var/empty/sshd:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin aminglinux:x:1000:1000:aminglinux:/home/aminglinux:/bin/bash
NR也可以用于如下的分段匹配:
# awk -F \':\' \'NR
5.awk中的数学运算Awk可以更改段值 。该命令示例如下:
# head -n 3 /etc/passwd |awk -F \':\' \'$1=\"root\"\'root x 0 0 root /root /bin/bashroot x 1 1 bin /bin /sbin/nologinroot x 2 2 daemon /sbin /sbin/nologin
Awk还可以对每个段的值执行数学运算 。命令示例如下:
# head -n2 /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin# head -n2 /etc/passwd |awk -F \':\' \'{$7=$3+$4}\'# head -n2 /etc/passwd |awk -F \':\' \'{$7=$3+$4; print $0}\'root x 0 0 root /root 0bin x 1 1 bin /bin 2
Awk还可以计算某段的和 。该命令示例如下:
# awk -F \':\' \'{(tot=tot+$3)}; END {print tot}\' /etc/passwd84699
END这里是awk特有的语法,表示已经执行了所有的行 。如下所示:
# awk -F \':\' \'{if ($1==\"root\") {print $0}}\' /etc/passwdroot:x:0:0:root:/root:/bin/bash
其实awk可以写成脚本文件,有自己的语法 。awk中可以使用If判断和for循环,但是在日常管理中使用如此复杂的语句并不常见 。
最后,我们附上一个常见的常规字符的解释 。
。表示任何字符,如空大小写、特殊符号等 。
*表示*前面有0个或多个字符,如a*,表示0个A或多个A 。
。*表示任意字符,表示贪婪匹配 。
+表示+前面有一个或多个字符,如a+表示A、aa、aaa……...
?就这样吗?前面有1或0个字符 。
{}是里面的一个范围,比如{1,5},也就是{}前面有1~5个字符 。
|表示或,例如,a|b是A或b 。
表示其中任意一个字符,比如[abc]是A或者B或者c,另外还可以用范围[0-9]表示任意数字,用[a-z]表示任意小写字母 。
推荐阅读
- 细胞凋亡的检测方法有哪些 细胞凋亡
- 批量加水印的方法
- 小小洗衣机怎么清理
- 宝宝驱蚊成分哪种安全有效 夏天宝宝驱蚊方法大全
- 宝宝不爱吃饭怎么办 让宝宝爱上吃饭的方法
- 贴汽车膜的正确方法 怎样正确贴汽车膜
- 怎么找出车上的定位器 五种方法教你找出车上被人恶意安装的GPS
- 寒露霜降养生的方法有哪些 寒露霜降时应该如何食补
- 调养肠胃最好方法 如何调理肠胃
- 2017三伏天预防小儿肠胃炎的食疗方法