shell判斷grep結果是否空,Linux grep命令的一些使用體會

 2023-10-08 阅读 23 评论 0

摘要:關于grep命令的使用規則我推薦以下這篇文章 @斷了的 已經把使用規則總結的很詳細:https://blog.51cto.com/90sec/1435142 這里總結一下自己在學習時遇到的一些問題與大家分享。 1、顯示三個用戶root、zmh、tomcat的UID和默認shell [root@centos7 14:26:19 ~]#e

關于grep命令的使用規則我推薦以下這篇文章 @斷了的××× 已經把使用規則總結的很詳細:
https://blog.51cto.com/90sec/1435142

這里總結一下自己在學習時遇到的一些問題與大家分享。

1、顯示三個用戶root、zmh、tomcat的UID和默認shell

[root@centos7 14:26:19 ~]#egrep '^(root|zmh|tomcat)' /etc/passwd|cut -d: -f1,3,7
root:0:/bin/bash
zmh:1000:/bin/bash
tomcat:1001:/bin/bash

shell判斷grep結果是否空。2、統計last命令中以root登錄的每個主機IP地址登錄次數

[root@centos7 14:32:50 ~]#last | grep '\(^root\)'|grep -o '[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}' | sort |uniq -c2 172.20.101.1462 172.20.101.16260 172.20.101.2123 172.20.102.1511 172.20.102.20930 172.20.95.9947 192.168.30.11 192.168.30.101
如果這里還需要按登錄次數大小排序就再sort一次。
另外IP地址前三段都是1-3位數字加上.符號構成的,因此可以使用相同規則重復匹配三次再加上第四位地址即可
[root@centos7 15:33:05 ~]#last | grep '\(^root\)'|grep -E -o '([[:digit:]]{1,3}\.){3}[0-9]{1,3}' | sort |uniq -c2 172.20.101.1462 172.20.101.16260 172.20.101.2123 172.20.102.1511 172.20.102.20930 172.20.95.9947 192.168.30.11 192.168.30.101

在本人解答這個問題時出現了以下情況:
Linux grep命令的一些使用體會
這樣看似已經將結果選擇,但是一旦加上-o 只顯示命中結果就出現問題了:
Linux grep命令的一些使用體會

敲黑板!!一定要弄清楚grep 匹配的是模式,模式,模式!

上圖中第一行“192.168”
“192”匹配的是正則中的"[[:digit:].]{1,3}" 它表示數字或者.點字符任意匹配一次到三次,也就是可以匹配的是1-3個純數字或者1-3個.點字符與數字構成的結果或者是1-3個.點字符。
“192”與“168”之間的.點對應的是正則中的"\."
最后“168”對應的是正則中的“[^[:space:]]{1,3}” 任意非空字符1-3次匹配

shell grep?在第二行“.30.1”
其中".30"匹配的是"[[:digit:].]{1,3}"。
中間的.點符號匹配的是正則中的"\."
最后“1”匹配的是“[^[:space:]]{1,3}”

因此一個IP地址段被匹配了兩次,所以會出現-o選項沒有達到我們預期將IPV4地址整體取出的預期

3、顯示ifconfig命令結果中所有IPv4地址

在Centos6中:
[root@centos6 ~]# ifconfig | grep -E -o "inet addr:([[:digit:]]{1,3}.){1,3}[0-9]{1,3}" | grep  -o '[^inet addr:].*'
192.168.30.101
172.20.102.151
127.0.0.1
Centos7中:
[root@centos7 16:08:49 ~]#ifconfig | grep -E -o "inet ([[:digit:]]{1,3}.){1,3}[0-9]{1,3}" | grep  -o '[^inet addr:].*'
172.20.95.240
192.168.30.104
127.0.0.1
192.168.122.1
以下是一種通用的過濾模式:
[root@centos7 16:12:16 ~]#ifconfig | grep -o 'inet [^[:space:]]\+' | grep -o '[[:digit:].]\+'
172.20.95.240
192.168.30.104
127.0.0.1
192.168.122.1
如果需要剔除127.0.01再用-v選項過濾一次即可以上問題當然可以配合其他命令來選出IP,簡單的程序鏈接起來用才是最好的!
[root@centos7 17:11:44 ~]#ifconfig | grep -E '\<inet\>' | tr -s ' ' | cut -d ' ' -f3
192.168.30.104
127.0.0.1
192.168.122.1

4、使用grep 找出磁盤分區使用率最大的數值

[root@centos7 17:17:03 ~]#df | grep '/dev/sd' | egrep -o '[0-9]{1,3}%' | egrep -o '[0-9]{1,3}' | sort -n | tail -1
16這里先排除臨時文件系統已經可能存在的掛載光盤等非磁盤,再使用egrep加正則表達式找出磁盤使用數值再用sort 和tail取最大值。
當然可以配合其他命令更簡單些啦:
[root@centos7 17:24:58 ~]#df | grep '/dev/sd' | tr -s ' ' ':' | cut -d: -f5 | tr -d % | sort -n | tail -1
16

grep命令根據列查找。5、利用grep查基名和目錄名

[root@centos7 17:39:38 ~]#echo  "/etc/rc.d/init.d/" | egrep -o '[^/]+/?$'
init.d/
[root@centos7 17:43:10 ~]#echo  "/etc/rc.d/init.d/" | egrep -o '[^/]+/?$' | egrep -o '.*[^/]\>'
init.d[root@centos7 17:39:42 ~]#echo  "/etc/rc.d/init.d" | egrep -o '[^/]+/?$'
init.d
[root@centos7 17:39:46 ~]#echo  "/etc/rc.d/init.d" | egrep -o '[^/]+/?$'
以上看出基名最后是否帶/斜杠處理比較麻煩,在生產中很可能是不清楚最后是否帶斜杠的,而要得到不帶斜杠的基名是比較麻煩的,所以還是用basename命令或者用cut做分割吧

6、正則表達式中空行和空白行的表達:

[root@centos7 19:10:15 ~]#cd /data/
[root@centos7 19:10:17 data]#cp /etc/grub2.cfg  grub2
[root@centos7 19:10:45 data]#grep -n '^$' grub2 | cat -A
7:$
10:$
22:$
28:$
30:$
38:$
45:$
59:$
70:$
75:$
86:$
117:$
119:$
122:$
125:$
128:$
134:$
可以看到-n表示行號,后面通過cat -A看到這些行確實都是不包含任何字符的空行
再來看看空白行:
首先往文件中添加一行空白行
[root@centos7 19:11:10 data]#echo "   " >> grub2 
[root@centos7 19:11:29 data]#grep -n '^$' grub2 | cat -A
7:$
10:$
22:$
28:$
30:$
38:$
45:$
59:$
70:$
75:$
86:$
117:$
119:$
122:$
125:$
128:$
134:$
再使用^[[:space:]]$驗證
[root@centos7 19:12:54 data]#egrep -n '^[[:space:]]+$' grub2 | cat -A
142:   $可以看到行號和$符號之間有空格

轉載于:https://blog.51cto.com/4081735/2103505

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/130642.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息