24 shell 管道命令與過濾器


  • 1.管道命令的用法
  • 2.使用管道命令的好處:
  • 3.重定向和管道的區別
  • 4.Linux管道實例
  • 5.管道與重定向
    • 1)管道與輸入重定向
    • 2)管道與輸出重定向
  • 6.過濾器
  • 7.過濾器舉栗

1.管道命令的用法

將兩個或者多個命令(程序或者進程)連接到一起,把一個命令的輸出作為下一個命令的輸入,以這種方式連接的兩個或者多個命令就形成了管道(pipe)。管道使用豎線|連接多個命令,這被稱為管道符。

Linux 管道的具體語法格式如下:

command1 | command2
command1 | command2 [ | commandN... ]

當在兩個命令之間設置管道時,管道符|左邊命令的輸出就變成了右邊命令的輸入。只要第一個命令向標准輸出寫入,而第二個命令是從標准輸入讀取,那么這兩個命令就可以形成一個管道。

這里需要注意,command1 必須有正確輸出,而 command2 必須可以處理 command1 的輸出結果;而且 command2 只能處理 command1 的正確輸出結果,不能處理 command1 的錯誤信息。

2.使用管道命令的好處:

命令
作用

3條命令來備份數據庫

mysqldump -u root -p '123456' wiki > /tmp/wikidb.backup

gzip -9 /tmp/wikidb.backup

scp /tmp/wikidb.backup username@remote_ip:/backup/mysql/

  • mysqldump 命令用於將wike數據庫備份到文件 /tmp/wikidb.backup。
  • gzip 命令用於壓縮較大的數據庫文件以節省磁盤空間;其中-9表示最慢的壓縮速度最好的壓縮效果。
  • scp 命令用於將數據庫備份文件復制到 IP 地址為 remote_ip 的備份服務器的 /backup/mysql/ 目錄下。其中username是登錄遠程服務器的用戶名,命令執行后需要輸入密碼。

使用管道命令

mysqldump -u root -p '123456' wiki | gzip -9 | ssh username@remote_ip "cat > /backup/wikidb.gz"

  • 命令的語法緊湊並且使用簡單。
  • 通過使用管道,將三個命令串聯到一起就完成了遠程 mysql 備份的復雜任務。
  • 從管道輸出的標准錯誤會混合到一起。
  • ssh username@remote_ip "cat > /backup/wikidb.gz"是將上個命令中生成的文件通過cat命令獲取文件內容並保存到/backup/wikidb.gz中

3.重定向和管道的區別

乍看起來,管道也有重定向的作用,它也改變了數據輸入輸出的方向,那么,管道和重定向之間到底有什么不同呢?

簡單地說,重定向操作符>將命令與文件連接起來,用文件來接收命令的輸出;而管道符|將命令與命令連接起來,用第二個命令來接收第一個命令的輸出。如下所示:

command > file
command1 | command1

4.Linux管道實例

 
 
輸出
將 ls 命令的輸出發送到 grep 命令,查看文件 log.txt 是否存在於當前目錄下

ls | grep log.txt

log.txt
重定向管道的輸出到一個文件

ls -al | grep log.txt >output.txt

cat output.txt

-rw-rw-r--. 1 mozhiyan mozhiyan 0 4月 15 17:26 log.txt

顯示按用戶名排序后的當前登錄系統的用戶的信息

who | sort

mozhiyan :0 2019-04-16 12:55 (:0)

mozhiyan pts/0 2019-04-16 13:16 (:0)

who 命令的輸出將作為 sort 命令的輸入,

所以這兩個命令通過管道連接后會顯示按照用戶名排序的已登錄用戶的信息。

5.管道與重定向

1)管道與輸入重定向

輸入重定向操作符<可以在管道中使用,以用來從文件中獲取輸入,其語法類似下面這樣:

command1 < input.txt | command2
command1 < input.txt | command2 -option | command3

功能
命令
輸出
使用 tr 命令從 os.txt 文件中獲取輸入,然后通過管道將輸出發送給 sort 或 uniq 等命令

cat os.txt

  • ddd
  • bbb
  • CCC
  • ccc

tr a-z A-Z <os.txt | sort

  • BBB
  • CCC
  • CCC
  • DDD

2)管道與輸出重定向

你也可以使用重定向操作符>或>>將管道中的最后一個命令的標准輸出進行重定向,其語法如下所示:

command1 | command2 | ... | commandN > output.txt
command1 < input.txt | command2 | ... | commandN > output.txt

功能
命令
輸出

使用 tr 命令將 os.txt 文件中的內容轉化為大寫,並使用 sort 命令將內容排序,

使用 uniq 命令去除重復的行,最后將輸出重定向到文件 ox.txt.new。

cat os.txt

  • ddd
  • bbb
  • CCC
  • ccc

tr a-z A-Z <os.txt | sort|uniq>os.txt.new

cat os.txt.new

  • BBB
  • CCC
  • DDD

 

6.過濾器

過濾器可以概括為兩點:

  • 如果一個 Linux 命令是從標准輸入接收它的輸入數據,並在標准輸出上產生它的輸出數據(結果),那么這個命令就被稱為過濾器。
  • 過濾器通常與 Linux 管道一起使用。


常用的被作為過濾器使用的命令如下所示:

命令
說明
awk 用於文本處理的解釋性程序設計語言,通常被作為數據提取和報告的工具。
cut 用於將每個輸入文件(如果沒有指定文件則為標准輸入)的每行的指定部分輸出到標准輸出。
grep 用於搜索一個或多個文件中匹配指定模式的行。
tar 用於歸檔文件的應用程序。
head 用於讀取文件的開頭部分(默認是 10 行)。如果沒有指定文件,則從標准輸入讀取。
paste 用於合並文件的行。
sed 用於過濾和轉換文本的流編輯器。
sort 用於對文本文件的行進行排序。
split 用於將文件分割成塊。
strings 用於打印文件中可打印的字符串。
tac 與 cat 命令的功能相反,用於倒序地顯示文件或連接文件。
tail 用於顯示文件的結尾部分。
tee 用於從標准輸入讀取內容並寫入到標准輸出和文件。
tr 用於轉換或刪除字符。
uniq 用於報告或忽略重復的行。
wc 用於打印文件中的總行數、單詞數或字節數。

7.過濾器舉栗

 
功能
命令
輸出
知識點
 
功能
命令
輸出
知識點
awk與管道結合 查看系統中的所有的賬號名稱,並按名稱的字母順序排序

awk -F: '{print $1}' /etc/passwd | sort|head -5

  • _apt
  • asample
  • backup
  • bin
  • daemon

-F: 以:作為分隔符,默認分隔符是空格

'{print $1}'打印第一列信息

  列出當前賬號最常使用的 5個命令

history | awk '{print $2}' | sort | uniq -c | sort -rn | head -5

    

  •      17 cat
  •      14 vim
  •      11 sudo
  •       7 ll
  •       7 cd

uniq -c 在每列旁邊顯示該行重復出現的次數。

sort -rn 按照數值的大小反向排序

  顯示當前系統的總內存大小,單位為 KB

free | grep Mem | awk '{print $2}'

2029860
free命令可以顯示Linux系統中空閑的、已用的物理內存及swap內存,及被內核使用的buffer
cut 與管道命令結合 查看系統中登錄 Shell 是/bin/bash的用戶名和對應的用戶主目錄的信息

grep "bin/bash" /etc/passwd|cut -d : -f1,6

 

root:/root

roaddb:/home/roaddb

asample:/home/asample

/ctc/passwd 文件用來存放用戶賬號的信息,文件中的每一行會記錄一個賬號的信息,每個字段之間用冒號分隔,第一個字段即是賬號的賬戶名,第六個字段就是賬號的主目錄的路徑。

 

  查看當前機器的CPU類型

cat /proc/cpuinfo |grep name|cut -d : -f 2|uniq

Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz  
  查看當前目錄下的子目錄數

ls -l|cut -c 1|grep d|wc -l

4 命令cut -c 1是截取每行的第一個字符
grep命令 查看系統日志文件中的錯誤信息

grep -i "error:" /var/log/messages | less

 

grep -iv [指定字條串] [文件] 在文件中搜索字符串匹配的行並輸出
-i 不區分大小寫 -v 排除指定字符串

  查看系統中 HTTP 服務的進程信息

ps aux | grep httpd

   
  查找我們的程序列表中所有命令名中包含關鍵字 zip 的命令

ls /bin /usr/bin | sort | uniq | grep zip

  • bunzip2
  • bzip2
  • bzip2recover
  • funzip
  • gpg-zip
  • gunzip
 
  查找 /etc 目錄下所有包含 IP 地址的文件

find /etc -type f -exec grep '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' {} \;

   
tar命令 復制一個目錄的整體結構

tar cf - /home/mozhiyan | ( cd /backup/; tar xf - )

   
  跨網絡地復制一個目錄的整體結構

tar cf - /home/mozhiyan | ssh remote_host "( cd /backup/; tar xf - )"

   
  跨網絡地壓縮復制一個目錄的整體結構

tar czf - /home/mozhiyan | ssh remote_host "( cd /backup/; tar xzf - )"

   
  檢査 tar 歸檔文件的大小,單位為字節

cd /; tar cf - etc | wc -c

   
  檢查 tar 歸檔文件壓縮為 tar.gz 歸襠文件后所占的大小

tar czf - etc.tar | wc -c

   
  檢查 tar 歸檔文件壓縮為 tar.bz2 歸襠文件后所占的大小

tar cjf - etc.tar | wc -c

   
head 命令 顯示 ls 命令的前 10 行輸出

ls /usr/bin | head

  • 2to3
  • 2to3-2.7
  • 2to3-3.5
  • X11
  • [
  • aclocal
  • aclocal-1.15
  • acyclic
  • add-patch
  • addpart
默認的輸出行數為 10 行
  顯示 ls 命令的前 5 行內容。

ls /usr/bin | head -n 5

  • 2to3
  • 2to3-2.7
  • 2to3-3.5
  • X11
  • [
 
uniq命令 去掉輸出中重復的行

sort testfile | uniq

   
  顯示輸出中各重復的行出現的次數,並按次數多少倒序顯示

sort testfile | uniq -c | sort -nr

   
wc命令 統計當前登錄到系統的用戶數

who | wc -l

2 wc 命令用於統計包含在文本流中的字符數、單同數和行數
  統計當前的 Linux 系統中的進程數

ps -ef | wc -l

70  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM