网站首页知识问答 >正文
文章目录[隐藏]
截取文件中的一段。匹配字符或字符串条件运算符awk的内置变量awk中的数学运算文本分析(课题研究的常用方法)
Awk是一个流编辑器,它对文档中的行进行操作,并逐行执行它们。Awk可以非常方便高效的操作文档和字符,从而实现我们想要的格式。它的功能非常强大,我经常在shell脚本中使用它来处理字符串。以下是awk在工作中经常用到的几种用法。
截取文件中的一段。例子如下:
# 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
匹配字符或字符串过滤掉文档中包含指定字符串的行。示例命令如下:
# 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,并且只打印匹配的段。
条件运算符有时候匹配字符的时候要给一个限定条件,比如第三段的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
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
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]表示任意小写字母。
目前上述的内容应该能够为大家解答出大家对于文本分析(课题研究常用方法)的疑惑了,所以如果大家还想要了解更多的知识内容,也可以关注本站其他文章进行了解哦。
版权说明:本文由用户上传,如有侵权请联系删除!
- 上一篇:今日更新乳贴怎么清洗和保存,乳贴一天可以用多久
- 下一篇:最后一页
猜你喜欢:
- 2022-05-11今日更新请事假怎么扣工资
- 2022-05-22今日更新个人无力偿还债务怎么处理
- 2022-05-06今日更新球裤里面的裤子叫什么 为什么球裤里面还要穿长裤
- 2022-05-19今日更新醉驾怎么判
- 2022-05-06今日更新科比战靴最高评价是哪一代 科比战靴全系列介绍
- 2022-05-07今日更新AJ1黑金蛇纹多少钱 AJ1黑金蛇纹在哪购买
- 2022-05-03今日更新回族麻叶子的做法和配方
- 2022-05-09今日更新离婚时房产分割的方式有哪些
最新文章:
- 2022-05-23今日更新单位集资房如何办理产权证集资建房可以办房产证吗
- 2022-05-23个人写真都有什么风格的(室内个人写真风格有哪几种)
- 2022-05-23今日更新appstore怎么切换id账号
- 2022-05-23qq飞车光明骑士几个喷(QQ飞车T2光明骑士和S海神之刺8喷哪个更好?)
- 2022-05-23今日更新乳贴怎么清洗和保存,乳贴一天可以用多久
- 2022-05-23今日更新蓝胶是什么
- 2022-05-23今日更新婚后房产 如何放弃产权夫妻一方放弃产权协议内容
- 2022-05-23镜箱豆腐是哪个地方的菜(镜箱豆腐是哪里的菜)
- 2022-05-23摩托罗拉手机型号大全(摩托罗拉手机型号大全)
- 2022-05-23今日更新4k和1080p区别大吗
- 2022-05-23今日更新如何快速抑制肠鸣,为何会肠鸣
- 2022-05-23今日更新什么是盐
- 2022-05-23今日更新各地对小产权房是如何拆迁的小产权房子拆迁有补偿么怎么补偿
- 2022-05-23镜箱豆腐是哪个地方的菜(镜箱豆腐是哪里的菜)
- 2022-05-23今日更新广西省有哪些市
- 热点推荐
- 热评文章