文本處理工具應用練習

練習:

 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 文件中行首為某單詞(包括下劃線) 后面跟一個小括號的行

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

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

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 16:04
下一篇 2016-08-08 16:04

相關推薦

  • sed初步認識

     ◆ sed基礎概念 ◆ sed用法 一.sed 基礎概念: Stream EDitor (流/行編輯器) sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕…

    2017-03-16
  • Linux Cluster之Keepalived + Nginx的實現

      一、實驗環境 http server1與http server2組成web集群,由nginx服務器實現負載均衡代理,使用keepalived保證nginx服務的高可用。通過虛擬IP192.168.154.177對外提供web服務。 實驗目的: 1)當Nginx server1上的nginx服務異常時,由nginx server2提供反帶服務。 …

    2016-11-02
  • 第三周作業

    1、列出當前系統上所有已登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 ~]# who | cut -d ' ' -f 1 | sort -u 2、取出最后登錄到當前系統的用戶的相關信息。 ~]# la…

    Linux干貨 2016-12-19
  • 如何在 Linux 下大量屏蔽惡意 IP 地址

    很多情況下,你可能需要在Linux下屏蔽IP地址。比如,作為一個終端用戶,你可能想要免受間諜軟件或者IP追蹤的困擾。或者當你在運行P2P軟件時。你可能想要過濾反P2P活動的網絡鏈接。如果你是一名系統管理員,你可能想要禁止垃圾IP地址訪問你們的公司郵件服務器。或者你因一些原因想要禁止某些國家訪問你的web服務。在許多情況下,然而,你的IP地址屏蔽列表可能會很快…

    Linux干貨 2015-02-26
  • 第三周作業

    1、列出當前系統上所有已登陸的用戶名:          [root@yangjifeng~]# who | cut -d ‘ ‘ -f 1 | sort -u     root 2、取出最后登陸到當前系統的用戶信息; &nb…

    Linux干貨 2017-08-28
  • Ansible(From Wikipedia)

           Ansible 是一個免費的用于配置和管理計算機的的軟件平臺。它集成了軟件部署,ad hoc任務執行,和管理配置的功能。它依賴Python2.4之后的版本和通過SSH或者PowerShell管理節點。模塊工作在JSON格式,輸出信息可以被任何編程語言再次編寫。系統管理員可以使用YAML…

    Linux干貨 2015-11-18
欧美性久久久久