『忘了再學』Shell基礎 — 8、管道符介紹

繁華似錦Fighting發表於2022-04-07

我們之前已經有文章說過管道符了,今天這裡再簡單總結一下用法。

1、行提取命令grep

grep命令的作用,是在指定的檔案中,搜尋符合條件的字串。

命令格式:

[root@localhost ~ ] # grep [選項] ”搜尋內容” 檔名

選項:

  • -A 數字:列出符合條件的行,並列出後續的n行。
  • -B 數字:列出符合條件的行,並列出前面的n行。
  • -c:統計找到的符合條件的字串的次數。
  • -i:忽略大小寫。
  • -n:輸出行號。
  • -v:反向查詢。
  • --color=auto:搜尋出的關鍵字用顏色顯示。

示例:

  • 例子1:查詢使用者資訊檔案/etc/passwd中,有多少可以登入的使用者。
    [root@localhost ~]# grep "/bin/bash" /etc/passwd
    
  • 例子2:查詢使用者資訊檔案/etc/passwd中,包含有root的行,並列出後續的3行。
    [root@localhost ~]# grep -A 3 "root" /etc/passwd
    
  • 例子3:查詢使用者資訊檔案/etc/passwd中,可以登入的使用者,並顯示行號。
    [root@localhost ~]# grep -n "/bin/bash" /etc/passwd
    
  • 例子4:查詢使用者資訊檔案/etc/passwd中,不含有/bin/bash的行,其實就是列出所有的偽使用者。
    [root@localhost ~]# grep -v "/bin/bash" /etc/passwd
    

2、find和grep的區別

find命令是在系統當中搜尋符合條件的檔名,搜尋時檔名是完全匹配。如果需要模糊查詢,使用萬用字元進行匹配。

#建立檔案abc
[root@localhost ~ ] # touch abc

#建立檔案abcd
[root@localhost ~ ] # touch abcd

#查詢abc檔案
[root@localhost ~ ] # find . -name ”abc"
./abc

搜尋檔名是abc的檔案,只會找到abc檔案,而不會找到檔案abcd。雖然abed檔名中包含abc,但是find命令是完全匹配,只能和要搜尋的資料完全一樣,才能找到。

注意:

find命令是可以通過-regex選項識別正規表示式規則的,也就是說find命令可以按照正規表示式規則匹配,而正規表示式是模糊匹配。但是對於初學者而言,find命令和grep命令本身就不好理解,所以我們這裡只按照萬用字元規則來進行find查詢。

grep命令是在檔案當中搜尋符合條件的字串,如果需要模糊查詢,使用正規表示式進行匹配,搜尋時字串是包含匹配。

#在test檔案中寫入abc資料
[root@localhost ~ ] # echo abc > test

#在test檔案中再追加abcd資料
[root@localhost ~]#echo abcd >> test

#在test檔案中查詢abc字串
[root@localhost ~]#grep”abc" test
abc
abcd

grep命令查詢時,只要資料行中包含有abc,就會都列出,所以abcabed都可以查詢到。

3、管道符

管道符之前總結過,請看之前的文章:https://www.cnblogs.com/liuyuelinfighting/p/15530010.html

我們下面簡單的做幾個練習:

  • 練習1:
    查詢本地所有網路連線,提取包含ESTABLISHED(已建立連線)的行,就可以知道我們的伺服器上有多少已經成功連線的網路連線。
    [root@localhost ~]# netstat -an | grep "ESTABLISHED"
    
  • 練習2:
    如果想知道具體的網路連線數量,就可以再使用wc命令統計行數。
    [root@localhost ~]# netstat -an | grep "ESTABLISHED" | wc -l
    

4、萬用字元

萬用字元是用來匹配檔名的,檔名在查詢的時候是完全匹配的,必須一模一樣才會查詢出,否則就要加萬用字元,進行模糊查詢。

image

練習:

# 建立4個測試檔案
[root@localhost tmp]# touch abc
[root@localhost tmp]# touch abcd
[root@localhost tmp]# touch 012
[root@localhost tmp]# touch 0abc

# “*”代表查詢所有的檔案
[root@localhost tmp]# ls *
012 0abc abc abcd

# “?"匹配任意一個字元,所以會匹配0abc
#但是不能匹配abc,因為“?”"不能匹配空
[root@localhost tmp]# ls ?abc
0abc

# 匹配任何以數字開頭的檔案
[root@localhost tmp]# ls [0-9]*
012 0abc

# 匹配不已數字開頭的檔案
[root@localhost tmp]# ls [^0-9]*
abc abed

相關文章