awk-2 Regex搭配浅谈

awk回顾
awk - 简介 Linux 制表好工具

复习一下awk格式
awk [options] 'command' file(s)
这里command也有自己的格式pattern {awk操作命令}
patter 可以是Regex也可以是逻辑判断式

上一篇有稍微用到UID>100这逻辑判断式;
所以也有常见的==!=>< 等等的逻辑判断符号.

继续玩, 接着着重在Regex逻辑判断上
~表示匹配後面的Regex
!~表示不匹配後面的Regex

找出所有UserName开头是r的

透过~/RegexPattern/

awk -F ':' '$1~/^r.*/{print $1}' /etc/passwd 
# ^是Regex的符号, 用来表示下一个符号一定是搜寻对象的开头
# .代表任意符号
# *则代表前一个符号可以出现任意次数

https://ithelp.ithome.com.tw/upload/images/20210910/201049308zuWnJDWIr.png

找出所有UserName开头不是r的

透过!~/RegexPattern/

awk -F ':' '$1!~/^r.*/{print $1}' /etc/passwd 

https://ithelp.ithome.com.tw/upload/images/20210911/20104930uOtGyCOQfh.png

找出所有UID刚好是100的

透过$3==100做pattern; {print $1,$3}是awk操作命令

awk -F ':' '$3==100{print $1,$3}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210911/20104930tRxFRhffq7.png

awk command 扩充模式

awk [options] 'command' file(s)
command可以有BEGINEND; 分别在pattern {awk commands}的之前与之後套用的,
BEGIN会在读取任何输入行资料之前执行, 哪怕pattern没中半个
END在awk退出前执行

制作表格,显示/etc/passwd每行的行号, 字段数量, 用户名称

awk -F ':' 'BEGIN{print "Ln WordCnt User"}{print NR, NF, $1}END{print"----"FILENAME"----"}' /etc/passw

https://ithelp.ithome.com.tw/upload/images/20210911/20104930WjUyq3xXN3.png
结果有出来, 但格式不如预期
这次不自己用空格做编排, 改用\t水平制表符号(tab)

awk -F ':' 'BEGIN{print "Ln \tWordCnt \tUser"}{print NR "\t" NF "\t" $1}END{print"----"FILENAME"----"}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210911/2010493020zD59uCjj.png
是不是整整齐齐的了

透过BEGIN来设定字串分隔符号
之前都是透过option-F
现在也能透过BEGIN加上FS栏位分隔符号做设定
刚刚的例子改成

awk 'BEGIN{FS=":"; print "Ln \tWordCnt \tUser"}{print NR "\t" NF "\t" $1}END{print"----"FILENAME"----"}' /etc/passwd

能达成跟上图一样的字串分隔效果与显示结果

输出也不只是能有空格或tab
能搭配OFS输出栏位分隔符号, 来做设定

cat grepText.txt; \
awk 'BEGIN{OFS="-"}{print $1,$2,$3}' grepText.txt
love loove live l0ve lOve l@ve lovelove

https://ithelp.ithome.com.tw/upload/images/20210911/20104930oLAkwcYtvi.png
可以看到本来输出应该是空格的, 但透过OFS改成-做拼接

玩个无聊的功能
/etc/passswd的UserName我不想给人看到, 做个遮罩

awk 'BEGIN{FS=":"; print "Ln\tWordCnt\tUId\tUser"}{$3="xxxx"; print NR "\t" NF "\t" $3"\t"$1}END{print"----"FILENAME"----"}' /etc/passwd

https://ithelp.ithome.com.tw/upload/images/20210911/20104930P8wm9kmKXu.png
$3="xxxx"也能直接在awk操作命令中, 对某一个字段做值的赋予
如果有多个command, 要用;做区隔


<<:  前人种树,後人乘凉之自动产生程序码片段 (下)

>>:  Day08 - Gem-sidekiq-grouping 允许单个 sidekiq 处理多个相似(一样)的 jobs

不只懂 Vue 语法:後记 - 为自己坚持 30 天的参赛心得

终於完赛了,这篇文章会以个人完赛心得为主,可谓是零技术成分。(撒花~ 我以为完赛都是这样: 最後才没...

Day 07 Azure cognitive service- 於是,Chatbot 也有了智慧

Azure cognitive service- 於是,Chatbot 也有了智慧 Azure 认知...

【Day17-音讯】浅谈声音资料的基本分析方式——时间域与频率域

如同我们在Day14的时候提到的最常出现的四种资料类型,而前两天我们稍微谈了一下文字资料的基本处理,...

Nutrition Helper

实作 按照之前 Rich Menu 的思路,我们可以让使用者在点选不同主选单位置的时候丢出不同的文...

Day 04 建立关键字广告前,你所要谨记在心的事

很多人公司在设定广告活动时,常会犯了几个错,这些错也许不会造成什麽毁灭性的结果,但很有可能会每天浪费...