文本處理工具應用練習

練習:

 1 、找出ifconfig 命令結果中本機的IPv4 地址

思路:我們使用ifconfig命令可知,ip地址是在第二行,所以我們先篩選出第二行,

      第二行中的分隔符看起來很混亂,都是不規則的,有一個空格或多個空格的,沒有標準

      所以我們最好是建立一個標準分隔,好規范管理,,最后選出ip地址所在的列就可以了 

[root@localhost ~]# ifconfig |head -n2  ==>顯示前面輸出的前兩行,包含有ip地址的那一行
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.18.65  netmask 255.255.255.0  broadcast 172.18.18.255
[root@localhost ~]# ifconfig |head -n2|tail -n1   ==>同上原理,顯示只包含ip地址的行
        inet 172.18.18.65  netmask 255.255.255.0  broadcast 172.18.18.255
[root@localhost ~]# ifconfig |head -n2|tail -n1|tr " " ":"  ==>建立標準分隔符,將默認分隔符“ ”改為容易識別的":"
::::::::inet:172.18.18.65::netmask:255.255.255.0::broadcast:172.18.18.255
[root@localhost ~]# ifconfig |head -n2|tail -n1|tr " " ":"|tr -s ":"  ==>進一步簡化,刪除所有重復的字符以單獨一個字符表示,使之更容易識別
:inet:172.18.18.65:netmask:255.255.255.0:broadcast:172.18.18.255
[root@localhost ~]# ifconfig |head -n2|tail -n1|tr " " ":"|tr -s ":"|cut -d: -f3  ==>以“:”為分隔符,選擇第三列就是我們要選的ip地址
172.18.18.65
[root@localhost ~]#

 2 、查出分區空間使用率的最大百分比值

思路:和上面類似,以下輸出分隔符混亂,看都看暈了,所以一樣的要建立一個標準分隔符,好規范管理,取出使用率列后,

      按照數字大小排序,取最大的那個一行就可以得到最大空間使用率的百分比值了 ,如下

[root@localhost ~]# df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2       41922560  812752  41109808   2% /
devtmpfs          486268       0    486268   0% /dev
tmpfs             500664       0    500664   0% /dev/shm
tmpfs             500664    6832    493832   2% /run
tmpfs             500664       0    500664   0% /sys/fs/cgroup
/dev/sda3       20961280 3269760  17691520  16% /usr
/dev/sda1         496300  140252    356048  29% /boot
tmpfs             100136       0    100136   0% /run/user/0
[root@localhost ~]# df|tr " " ":"    ==>建立標準分隔符,將默認分隔符“ ”改為容易識別的":"
Filesystem:::::1K-blocks::::Used:Available:Use%:Mounted:on
/dev/sda2:::::::41922560::812752::41109808:::2%:/
devtmpfs::::::::::486268:::::::0::::486268:::0%:/dev
tmpfs:::::::::::::500664:::::::0::::500664:::0%:/dev/shm
tmpfs:::::::::::::500664::::6832::::493832:::2%:/run
tmpfs:::::::::::::500664:::::::0::::500664:::0%:/sys/fs/cgroup
/dev/sda3:::::::20961280:3269760::17691520::16%:/usr
/dev/sda1:::::::::496300::140252::::356048::29%:/boot
tmpfs:::::::::::::100136:::::::0::::100136:::0%:/run/user/0
[root@localhost ~]# df|tr " " ":"|tr -s ":"   ==>進一步簡化,刪除所有重復的字符以單獨一個字符表示,使之更容易識別
Filesystem:1K-blocks:Used:Available:Use%:Mounted:on
/dev/sda2:41922560:812752:41109808:2%:/
devtmpfs:486268:0:486268:0%:/dev
tmpfs:500664:0:500664:0%:/dev/shm
tmpfs:500664:6832:493832:2%:/run
tmpfs:500664:0:500664:0%:/sys/fs/cgroup
/dev/sda3:20961280:3269760:17691520:16%:/usr
/dev/sda1:496300:140252:356048:29%:/boot
tmpfs:100136:0:100136:0%:/run/user/0
[root@localhost ~]# df|tr " " ":"|tr -s ":"|cut -d: -f5  ==>以“:”為分隔符,第5列就是空間使用率
Use%
2%
0%
0%
2%
0%
16%
29%
0%
[root@localhost ~]# df|tr " " ":"|tr -s ":"|cut -d: -f5|sort -rn  ==>將空間使用率案數字大小排序
29%
16%
2%
2%
Use%
0%
0%
0%
0%
[root@localhost ~]# df|tr " " ":"|tr -s ":"|cut -d: -f5|sort -rn|head -n1   ==>只顯示第一行即空間使用率最大的一行
29%
[root@localhost ~]# df|tr " " ":"|tr -s ":"|cut -d: -f5|sort -rn|head -n1|tr -d "%"  ==>去掉“%”,得到分區空間使用率的最大百分比值
29

 3 、查出用戶UID 最大值的用戶名、UID 及shell 類型

思路:查看/etc/passwd文件可知,文件內容是使用“:”做分隔符的,開心啊..,我們要查看UID最大的的用戶信息,

      所以要以第三行來進行數字大小排序,然后選出最大的那一行,在根據分隔符選出自己想要的那幾列

[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...............................             ==>文件太長,就不全部顯示了,用省略號代替
basher:x:4330:4335::/home/basher:/bin/bash
nologin:x:4331:4336::/home/nologin:/bin/nologin
wang:x:4332:4337::/home/wang:/bin/bash
systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
[root@localhost ~]# cat /etc/passwd|sort -t: -k3 -n   ==>以“:”為分隔符,取第三列進行數字大小排序
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
.................                              ==>文件太長,就不全部顯示了,用省略號代替
tom:x:4327:4331::/home/tom:/bin/bash
bash:x:4328:4333::/home/bash:/bin/bash
testbash:x:4329:4334::/home/testbash:/bin/bash
basher:x:4330:4335::/home/basher:/bin/bash
nologin:x:4331:4336::/home/nologin:/bin/nologin
wang:x:4332:4337::/home/wang:/bin/bash
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@localhost ~]# cat /etc/passwd|sort -t: -k3 -n|tail -n1    ==>取出UID值最大的行
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@localhost ~]# cat /etc/passwd|sort -t: -k3 -n|tail -n1|cut -d: -f1,3,7    ==>以“:”為分隔符,選出用戶名,UID值,shell類型那幾列,自己數啊
nfsnobody:65534:/sbin/nologin
[root@localhost ~]#

 4 、查出/tmp 的權限,以數字方式顯示

思路:開始以為是將rwx換成對應的421,要是這么簡單就好了,此題要顯示的結果是777這樣的

      stat命令,查看時間戳的命令,此命令可以以數字方式顯示文件的權限,這樣就有方向了

      首先一樣的要先取出含有數字權限的行,然后靈活運用分隔符來取出數字權限,具體看下面操作

[root@localhost ~]# stat /tmp
  File: ‘/tmp’
  Size: 4096      	Blocks: 8          IO Block: 4096   directory
Device: 802h/2050d	Inode: 133         Links: 14
Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-29 10:26:25.542877847 +0800
Modify: 2016-08-06 10:27:25.572103012 +0800
Change: 2016-08-06 10:27:25.572103012 +0800
 Birth: -
[root@localhost ~]# stat /tmp|head -n4  ==>顯示前面輸出的前4行,包含有數字權限的那一行
  File: ‘/tmp’
  Size: 4096      	Blocks: 8          IO Block: 4096   directory
Device: 802h/2050d	Inode: 133         Links: 14
Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
[root@localhost ~]# stat /tmp|head -n4|tail -n1     ==>顯示包含數字權限的行
Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
[root@localhost ~]# stat /tmp|head -n4|tail -n1|cut -d"/" -f1    ==>以“/”為分割符,取第一行,結果如下
Access: (1777
[root@localhost ~]# stat /tmp|head -n4|tail -n1|cut -d"/" -f1|cut -d"(" -f2   ==>以“(”為分隔符,取第二行,結果如下
1777

因為stat命令顯示內容格式一樣,所以以上命令適用于任何文件,通用型

blob.png

當然方法不是唯一的,肯定還有別的方法表示,

 5 、統計當前連接本機的每個遠程主機IP 的連接數,并按從大到小排序

思路:netstat -nt是查看遠程主機ip的,因為遠程主機ip不是固定數量的,這里會提前用到grep篩選,grep后面也有,

      和前面幾題差不多,建立標準分隔符,然后選出想要的列即可,然后排序,然后顯示重復的行出現的次數,

      再排序,結果就出現了,如下

[root@localhost ~]# netstat -nt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 172.18.18.51:22             172.18.18.206:52175         ESTABLISHED 
tcp        0    192 172.18.18.51:22             172.18.18.206:58442         ESTABLISHED 
tcp        0      0 172.18.18.51:22             172.18.18.65:41764          ESTABLISHED 
tcp        0      0 172.18.18.51:22             172.18.18.65:41765          ESTABLISHED 
tcp        0      0 172.18.18.51:22             172.18.18.206:52181         ESTABLISHED 
[root@localhost ~]# netstat -nt|grep tcp                                                   ==>顯示遠程主機ip的信息
tcp        0      0 172.18.18.51:22             172.18.18.206:52175         ESTABLISHED 
tcp        0     64 172.18.18.51:22             172.18.18.206:58442         ESTABLISHED 
tcp        0      0 172.18.18.51:22             172.18.18.65:41764          ESTABLISHED 
tcp        0      0 172.18.18.51:22             172.18.18.65:41765          ESTABLISHED 
tcp        0      0 172.18.18.51:22             172.18.18.206:52181         ESTABLISHED 
[root@localhost ~]# netstat -nt|grep tcp|tr " " ":"                                      ==>建立標準分隔符,將默認分隔符“ ”改為容易識別的":"
tcp::::::::0::::::0:172.18.18.51:22:::::::::::::172.18.18.206:52175:::::::::ESTABLISHED:
tcp::::::::0:::::64:172.18.18.51:22:::::::::::::172.18.18.206:58442:::::::::ESTABLISHED:
tcp::::::::0::::::0:172.18.18.51:22:::::::::::::172.18.18.65:41764::::::::::ESTABLISHED:
tcp::::::::0::::::0:172.18.18.51:22:::::::::::::172.18.18.65:41765::::::::::ESTABLISHED:
tcp::::::::0::::::0:172.18.18.51:22:::::::::::::172.18.18.206:52181:::::::::ESTABLISHED:
[root@localhost ~]# netstat -nt|grep tcp|tr " " ":"|tr -s ":"                           ==>進一步簡化,刪除所有重復的字符以單獨一個字符表示,使之更容易識別
tcp:0:0:172.18.18.51:22:172.18.18.206:52175:ESTABLISHED:
tcp:0:64:172.18.18.51:22:172.18.18.206:58442:ESTABLISHED:
tcp:0:0:172.18.18.51:22:172.18.18.65:41764:ESTABLISHED:
tcp:0:0:172.18.18.51:22:172.18.18.65:41765:ESTABLISHED:
tcp:0:0:172.18.18.51:22:172.18.18.206:52181:ESTABLISHED:
[root@localhost ~]# netstat -nt|grep tcp|tr " " ":"|tr -s ":"|cut -d: -f6   ==>以“:”為分隔符,選擇遠程主機ip的列
172.18.18.206
172.18.18.206
172.18.18.65
172.18.18.65
172.18.18.206
[root@localhost ~]# netstat -nt|grep tcp|tr " " ":"|tr -s ":"|cut -d: -f6|sort  ==>排序,將相同的行整理到一起(這一步很重要)
172.18.18.206
172.18.18.206
172.18.18.206
172.18.18.65
172.18.18.65
[root@localhost ~]# netstat -nt|grep tcp|tr " " ":"|tr -s ":"|cut -d: -f6|sort |uniq -c ==>顯示重復行出現的次數
      3 172.18.18.206
      2 172.18.18.65
[root@localhost ~]# netstat -nt|grep tcp|tr " " ":"|tr -s ":"|cut -d: -f6|sort |uniq -c|sort -rn ==>按數字從大到小排序
      3 172.18.18.206
      2 172.18.18.65

上面有個sort指令特別提示很重要,那我們來看看如果沒有這一步會如何

[root@localhost ~]# netstat -nt|grep tcp|tr " " ":"|tr -s ":"|cut -d: -f6|uniq -c|sort -rn
      2 172.18.18.65
      2 172.18.18.206
      1 172.18.18.206

顯示的結果完全不同,這是因為uniq指令定義重復行是連續且完全相同的行,

所以盡管第二行和第三行是完全的行,但是因為不是連續的,uniq并沒有把它們顯示為重復行,

而是分開顯示了,用實例來說明吧

[root@localhost ~]# cat a
aaaaaa
bbbbbb
aaaaaa
aaaaaa
aaaaaa
[root@localhost ~]# cat a|uniq -c  ==>a文件的第一行沒有顯示為重復行,只有最下面連續的三行顯示為重復行
      1 aaaaaa 
      1 bbbbbb
      3 aaaaaa
[root@localhost ~]# cat a|sort    ==>把a文件排序后,所以的aaaaa都連續顯示了 
aaaaaa
aaaaaa
aaaaaa
aaaaaa
bbbbbb
[root@localhost ~]# cat a|sort|uniq -c  ==>再看,重復行變為四行了
      4 aaaaaa
      1 bbbbbb

正則表達式練習:

1 、顯示/proc/meminfo 文件中以大小s 開頭的行;( 要求:使用兩種方式)

思路:要求開頭是大小寫s的,所以要錨定行首,開始是s即可,后面是什么無所謂,就是指任意字符

指令如下:

grep -i "^s.*"  /proc/meminfo 
grep "^[sS].*"  /proc/meminfo 
[root@localhost ~]# grep -e "^s.*" -e "^S.*"  /proc/meminfo

blob.png

blob.png

? 2 、顯示/etc/passwd 文件中不以/bin/bash 結尾的行

思路:我們找出一/bin/bash結尾的行然后取反就可以了 ,因為是結尾,所以要錨定行尾如下:

[root@localhost ~]# grep  "/bin/bash$" /etc/passwd   ==>以/bin/bash結尾的行
[root@localhost ~]# grep -v "/bin/bash$" /etc/passwd   ==>使用-v選項取反,內容太多,就不全部顯示了
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
.......

? 3 、顯示用戶rpc 默認的shell 程序

思路:用戶rpc,所以錨定單詞,然后以分隔符取出shell所在的列

[root@localhost ~]# grep "\<rpc\>" /etc/passwd          ==>匹配用戶rpc所在的行
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
[root@localhost ~]# grep "\<rpc\>" /etc/passwd|cut -d: -f7   ==>以“:”為分隔符,取出sheel所在的列
/sbin/nologin
[root@localhost ~]#

? 4 、找出/etc/passwd 中的兩位或三位數

思路:兩位或三位數,所以是錨定單詞,數字出現兩次到三次

指令:

grep "\<[0-9]\{2,3\}\>" /etc/passwd

blob.png

5 、顯示/etc/grub2.cfg 文件中,至少以一個空白字符開頭的且后面存非空白字符的行

以空白字符開頭,即要使用行首錨定,至少一個,后面存在非空白字符,如下:

cat /etc/grub2.cfg |grep "^[[:space:]]\+[^[:space:]]"

blob.png

? 6 、找出"netstat -tan" 命令的結果中以'LISTEN' 后跟0 、1或多個空白字符結尾的行

思路:看到結尾就要行尾錨定,LISTEN后面跟任意個空白字符

指令:

netstat -tan|grep "LISTEN[[:space:]]*$"

blob.png

? 7 、添加用戶bash 、testbash 、basher 以及nologin( 其shell為 為

/sbin/nologin), 而后找出/etc/passwd 文件中用戶名同shell名 名

的行

思路:用戶和shell同名,所以要錨地單詞,且要錨定行首,因為同名,所以要用到后向引用,

       shell在最后,所以引用的時候要錨定行尾

指令:

cat /etc/passwd |grep "^\<\(.*\)\>.*\1$"

blob.png

以上指令可以理解為:前面括號里面出現在行首的任意單詞,都要在行尾出現一次,\就是后向引用,

                    引用前面出現的單詞,而兩個相同單詞中間可以出現任意字符(即是指的后面一個.*) 

                    行首單詞a(^\<\(.*\)\>) 任意字符(.*) 行尾單詞a(\1$)

擴展正則表達式練習

1 、顯示當前系統root 、mage 或wang 用戶的UID 和默認shell

(root|mage|wang)表示或關系,因為是特指用戶所有行首錨定,詞尾錨定

指令:

egrep "^(root|mage|wang)\>" /etc/passwd

blob.png

 2 、找出/etc/rc.d/init.d/functions 文件中行首為某單詞(包括下劃線) 后面跟一個小括號的行

思路:行首錨定,單詞錨定,單詞中包含數字字母下劃線至少出現一次,后面括號,

注意:擴展正則表達式和基本正則表達式元字符使用時要差異,最明顯的是轉義符,謹記?。。。。。。?/strong>

blob.png

 3 、使用egrep 取出/etc/rc.d/init.d/functions 中其基名

說明:基名即使functions

思路:基名肯定是在行尾,所有錨定行尾,且不能有“/”

指令:

echo /etc/rc.d/init.d/functions|egrep  -o "[^/]+$"

blob.png

 4 、使用egrep 取出上面路徑的目錄名

   本來想做上面也一題的,莫名其妙把這題搞出來了,也是醉了

指令:

echo /etc/rc.d/init.d/functions|egrep -o "/.*/"

blob.png

? 5 、統計以root 身份登錄的每個遠程主機IP 地址的登錄次數

指令:

last |egrep "root"|egrep -o  "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"|sort|uniq -c|sort -n

blob.png

6 、利用擴展正則表達式分別表示0-9 、10-99 、100-199、  200-249 、250-255

 說明:上面一題已經顯示過了

egrep -o  "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"

? 7 、顯示ifconfig 命令結果中所有IPv4

  說明: 第五題方法也可解決此問題

ifconfig |egrep -o  "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"

blob.png

課后習題

1、統計/etc/init.d/functions 文件中每個單詞出現的次數,并按頻率從高到低顯示

cat /etc/init.d/functions |grep -o "\<[[:alnum:]]*\>"|sort|uniq -c|sort -n

blob.png

2、正則表達式表示身份證號

   驗證我的身份證號碼成功了,但是感覺有問題

echo 420117198912073577 | egrep "(^[1-9][0-9]{16}[[:digit:]xX]$)|^([1-9][0-9]{14})$"
echo 420117198912073577 | egrep "(\<[1-9][0-9]{16}[[:digit:]xX]\>)|\<([1-9][0-9]{14})\>"

blob.png

3、正則表達式表示手機號

手機號碼11位,開頭固定為1,第二位我知道的是3,5,8,要是不對可以再換,后面9位數字

echo 18922718172|egrep "^1[358][0-9]{9}$"

blob.png

4、正則表達式表示郵箱

   我不太了解郵箱的必要條件,所以可能有漏掉一些字符,,以下我自己的郵箱是符合的…..

echo 0811_7...64@126.com |egrep "[[:alnum:]_.]+@[[:alnum:]_.]+\.com"

blob.png

5、正則表達式表示QQ號

echo 381147864|egrep "\<[1-9][0-9]{4,}"

blob.png

以上這些題目希望老師能最好在能夠在上課的時候稍微講一下 !!

原創文章,作者:qiuwei,如若轉載,請注明出處:http://www.www58058.com/29972

(0)
qiuweiqiuwei
上一篇 2016-08-08
下一篇 2016-08-08

相關推薦

  • FHS文件系統下個各目錄功能

    FHS文件系統下個各目錄功能 FHS文件系統的建立是為了讓開發者和用戶可以預測軟件安裝文件和文件夾的位置。對整個linux的文件系統系統做了以下的規范:     /bin:命令二進制文件的存放目錄;     /boot:系統啟動時一些文件存放的目錄,包含引導linux的重要文件,…

    Linux干貨 2016-10-18
  • linux中管道重定向

    linux中管道重定向 Linux 給程序提供三種I/O設備:    查看是否成功  echo $?      需要再執行命令后直接使用               &n…

    Linux干貨 2017-02-21
  • 【社招】【小米-北京】linux內核工程師

    【社招】【小米-北京】內核工程師 【工作地點】北京市海淀區安寧莊東路72號科利源大廈 【薪酬福利】20k-40k 期權獎勵、六險一金、水果花茶、班車、健身房、食堂 【投遞方式】郵件主題“崗位+姓名”發送至lipengcheng3@xiaomi.com   崗位職責: 1.      負責內…

    Linux干貨 2017-07-28
  • 馬哥教育網絡班20期+第二周課程練習

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。  答:文件管理類命令有: touch :創建一個新文件 示例:在/tmp/目錄下創建一個1.log文件 touch /tmp/1.log mv:移動文件  示例:將/etc/fstab文件移至/tmp/目錄中。  mv /etc/fstab /tmp/…

    Linux干貨 2016-06-23
  • shell腳本編程入門

    什么是shell腳本,其實,shell腳本就是利用shell的功能所寫的一個程序,這個程序是使用純文本文件,將一些shell的語法與命令(包含外部命令)寫在里面,搭配正則表達式、管道命令與數據流重定向等功能等這些命令的組合起來,以達到我們所想要的目的。 程序編程風格有兩種: 過程式:以指令為中心,數據服務于指令。 對象式:以數據為中心,指令服務于數據。 過程…

    Linux干貨 2016-08-18
  • 幾個正則表達式和find查找語句事例

    顯示當前系統上root、fedora、或user1用戶的默認shell; ~]# grep -E "^(root|bin|hadop)" /etc/passwd | cut -d: -f7 找出/etc/rc.d/init.d/functions文件中某單詞后面跟一組小括號的行,形如: hello(); ~]#grep -E -o &qu…

    Linux干貨 2016-10-30
欧美性久久久久