Linux中的管道和过滤器
管道
Shell可以將兩個或多個程序連接到一起,以使一個程序的輸出變成另一個程序的輸入,這種方式連接的兩個或者多個程序就形成了管道。管道通常用于執行一些復雜的數據處理操作。這些命令之間使用控制操作符(管道符)"|"連接。
管道的語法格式:
command1 | command2 command1 | command2 [ commandN... ]操作符"|"與">"的區別
">"是將第一個命令的輸出寫入到后面的文件或者特定文件描述符指定的文件中。如:
[root@rs1 ~]# ls > less [root@rs1 ~]# ls anaconda-ks.cfg httpd-2.4.6-45.el7.x86_64.rpm less [root@rs1 ~]# cat less anaconda-ks.cfg httpd-2.4.6-45.el7.x86_64.rpm lessls命令將當前目錄所有的文件/目錄名都輸出,由重定向操作符">"寫入到less文件中。
"|"是將第一個命令的輸出作為輸入,用第二個命令去處理。如:
[root@rs1 ~]# ls | cat anaconda-ks.cfg httpd-2.4.6-45.el7.x86_64.rpm less [root@rs1 ~]# ls anaconda-ks.cfg httpd-2.4.6-45.el7.x86_64.rpm lessls命令將當前目錄所有的文件/目錄名都輸出,cat命令將ls的輸出結果作為輸入,去執行,打印結果到終端。
為什么要使用管道
管道是進程間通信的方式之一,Shell使用管道的原因:
命令的與發緊湊并且簡單
使用管道,將多個命令串連到一起,有時候可以完成命令單獨執行不方便或者不能完成的復雜任務
從管道輸出的標準錯誤會混合到一起
使用管道連接程序
實例1:使用管道可以查看指定進程的運行狀態,如果加上輸出重定向,還可以將指定結果輸出到某個文件中。如:
[root@rs1 ~]# ps -ax | grep httpd > httpd.state [root@rs1 ~]# cat httpd.state 1930 ? ? ? ? Ss ? ? 0:00 /usr/sbin/httpd -DFOREGROUND1931 ? ? ? ? S ? ? 0:00 /usr/sbin/httpd -DFOREGROUND1932 ? ? ? ? S ? ? 0:00 /usr/sbin/httpd -DFOREGROUND1933 ? ? ? ? S ? ? 0:00 /usr/sbin/httpd -DFOREGROUND1934 ? ? ? ? S ? ? 0:00 /usr/sbin/httpd -DFOREGROUND1935 ? ? ? ? S ? ? 0:00 /usr/sbin/httpd -DFOREGROUND1941 pts/2 ? R+ ? ? 0:00 grep --color=auto httpd實例2:顯示按用戶名排序后的當前登陸系統的用戶信息
[root@rs1 ~]# w | sort00:59:50 up 9 min, 4 users, load average: 0.00, 0.01, 0.03 root ? ? pts/0 ? ? 00:51 ? 8:26 ? 0.00s 0.00s -bash root ? ? pts/1 ? ? 00:51 ? 8:06 ? 0.00s 0.00s -bash root ? ? pts/2 ? ? 00:51 ? 6.00s 0.01s 0.00s w root ? ? pts/3 ? ? 00:51 ? 8:11 ? 0.00s 0.00s -bash USER ? ? TTY ? ? ? LOGIN@ ? IDLE ? JCPU ? PCPU WHATw命令的輸出作為sort命令的輸入,從而將用戶按順序排列。
實例3:統計當前系統中登陸用戶數
[root@rs1 ~]# who | wc -l 4實例4:查看系統中安裝的glibc包的版本
[root@rs1 ~]# rpm -qa |grep glibc glibc-2.17-55.el7.x86_64 glibc-common-2.17-55.el7.x86_64實例5:以比較容易讀取格式,顯示系統中掛載的偽文件系統信息
[root@rs1 ~]# mount | grep "proc" | column -t proc ? ? ? on /proc ? ? ? ? ? ? ? ? ? ? type proc ? (rw,nosuid,nodev,noexec,relatime) systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=32,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)實例6:將一個列文件中的內容轉換為一行
[root@rs1 ~]# cat less anaconda-ks.cfg httpd-2.4.6-45.el7.x86_64.rpm less [root@rs1 ~]# cat less | tr '\n' ' ' | xargs anaconda-ks.cfg httpd-2.4.6-45.el7.x86_64.rpm less實例7:生成一個7位的隨機密碼
[root@rs1 ~]# tr -dc A-Za-z0-9_ < /dev/urandom | head -c7 | xargs P2v1y_x管道中的輸入重定向
輸入重定向操作符"<"可以在管道中使用,用來從文件中獲取輸入。其語法:
command1 < input.txt | command2如:使用tr命令從less文件中獲取輸入,然后通過管道將輸出發送給sort命令:
[root@rs1 ~]# cat less anaconda-ks.cfg httpd-2.4.6-45.el7.x86_64.rpm less less ? [root@rs1 ~]# tr a-z A-Z < less | sort ANACONDA-KS.CFG HTTPD-2.4.6-45.EL7.X86_64.RPM LESS LESS ? [root@rs1 ~]# tr a-z A-Z < less | sort | uniq ANACONDA-KS.CFG HTTPD-2.4.6-45.EL7.X86_64.RPM LESS使用管道中的輸出重定向
可以使用重定向操作符">"或">>"將管道中最后一個命令的標準輸出進行重定向。語法:
command1 | command2 | ... | commandN > output_file command1 < input_file | command2 | ... | commandN > output_file如:使用who命令顯示當前登陸的用戶,并使用sort命令排序,最后保存到指定文件中。
[root@rs1 ~]# who | sort > who.txt [root@rs1 ~]# cat who.txt root ? ? pts/0 ? ? ? 2018-07-15 00:51 (fsx) root ? ? pts/1 ? ? ? 2018-07-15 00:51 (fsx) root ? ? pts/2 ? ? ? 2018-07-15 00:51 (fsx) root ? ? pts/3 ? ? ? 2018-07-15 00:51 (fsx)過濾器
將幾個命令通過管道符組合在一起就形成了管道。通常,通過這種方式使用的命令就被稱為過濾器。過濾器會獲取輸入,通過某種方式修改其內容,然后將其輸出。
簡單的說,過濾器有如下特點:
如果一個LInux命令是從標準輸入接收它的輸入數據,并在標準輸出上產生他的輸出,這個命令就被稱為過濾器
過濾器通常和Linux管道一起使用
常用的被作為過濾器的命令如下:
| awk | 用于文本處理的解釋性程序設計語言,通常作為數據提取和報告的工具 |
| cut | 用于將每個輸入文件的每行指定部分輸出到標準輸出 |
| grep | 用于搜索一個或多個文件中匹配指定模式的行 |
| tar | 用于歸檔文件的應用程序 |
| head | 用于讀取文件的開頭部分。如果沒有指定文件,則從標準輸入讀取 |
| paste | 用于合并文件的行 |
| sed | 用于過濾和轉換文本的流編輯器 |
| sort | 用于對文本文件的行進行排序 |
| split | 用于將文件分割分塊 |
| strings | 用于打印文件中可打印的字符串 |
| tac | 與cat命令功能相反,用于倒序顯示文件或連接文件 |
| tail | 用于顯示文件的結尾部分 |
| tee | 用于從標準輸入讀取內容并寫入到標準輸出和文件 |
| tr | 用于轉換或刪除字符 |
| uniq | 用于報告或忽略重復行 |
| wc | 用于打印文件中的總行數、單詞數或字節數 |
在管道中使用awk命令
實例1:查看系統中所有帳號的名稱,并按名稱的字母數須排序。
[root@rs1 ~]# awk -F: '{print $1}' /etc/passwd | sort adm apache avahi avahi-autoipd bin daemon dbus ftp games halt kiosk lp mail nobody operator polkitd postfix root shutdown sshd sync":"為列分割符,將文件/etc/passwd內容分為多列,并打印到第一列的信息,通過管道發送給sort命令
實例2:查看當前帳號最常用的10個命令
[root@rs1 ~]# history | awk '{print $2}' | sort | uniq -c | sort -rn | head255 vim222 bash204 ls58 cd54 cat19 crontab17 rm14 tr12 sed11 echohistroty命令將輸出通過管道發送給awk,awk命令默認使用空格作為列分割符,將history的輸出分為兩列,將第二列的內容作為輸出通過管道符發送給sort命令,sort排序后,將輸出通過管道符號發送給uniq命令,uniq命令統計歷史命令的出現次數,再用sort將uniq命令處理的輸出按照重復次數從高到底排序,最后傳遞給head命令,head列出前10個(默認是10個)。
實例3:西那是當前系統的內存大小,單位為KB
[root@rs1 ~]# free | grep Mem | awk '{print $2}' 501884在管道中使用cut命令
cut命令被用于文本處理,可以使用cut來提取文件中指定的列內容。
實例1:查看系統中登陸Shell是"/bin/bash"的用戶名和對應的用戶主目錄信息
[root@rs1 ~]# grep "/bin/bash" /etc/passwd | cut -d: -f1,6 root:/root kiosk:/home/kiosk/etc/passwd中以":"分割,第一個字段是帳號的賬戶名,第六個字段是主目錄的路徑
實例2:查看當前即其的CPU類型
[root@rs1 ~]# cat /proc/cpuinfo | grep name | cut -d: -f2 | uniqIntel Xeon E312xx (Sandy Bridge) 或者: [root@rs1 ~]# lscpu | grep "Model name" | cut -d: -f2Intel Xeon E312xx (Sandy Bridge)實例3:查看當前目錄下子目錄的個數
[root@rs1 mnt]# ls -l | cut -c 1 | grep d |wc -l 10這里解釋:
ls -l輸出的內容,每行的第一個字符表示文件類型,如果是d,則表示是目錄
cut -c 1是截取每行的第一個字符
grep d是獲取文件類型為目錄的行
wc -l是統計grep輸出的行數,即目錄個數
在管道中使用grep命令
grep是管道中十分常用的一個命令。
實例1:查看系統中HTTP服務的進程信息
[root@rs1 mnt]# ps -ax | grep httpd1930 ? ? ? ? Ss ? ? 0:00 /usr/sbin/httpd -DFOREGROUND1931 ? ? ? ? S ? ? 0:00 /usr/sbin/httpd -DFOREGROUND1932 ? ? ? ? S ? ? 0:00 /usr/sbin/httpd -DFOREGROUND1933 ? ? ? ? S ? ? 0:00 /usr/sbin/httpd -DFOREGROUND1934 ? ? ? ? S ? ? 0:00 /usr/sbin/httpd -DFOREGROUND1935 ? ? ? ? S ? ? 0:00 /usr/sbin/httpd -DFOREGROUND2200 pts/3 ? R+ ? ? 0:00 grep --color=auto httpd實例2:差早承襲列表中所有包含zip關鍵字的命令
[root@rs1 mnt]# ls /usr/bin/ /bin/ | sort | uniq | grep zip gpg-zip gunzip gzip實例3:查看系統安裝的kernal版本和相關的kernel軟件包
[root@rs1 mnt]# rpm -qa | grep kernel kernel-3.10.0-123.el7.x86_64 kernel-tools-3.10.0-123.el7.x86_64 kernel-tools-libs-3.10.0-123.el7.x86_64實例4:查到/etc目錄下所有包含IP地址的文件
[root@rs1 mnt]# find /etc -type f -exec grep '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]' {} \;在管道中使用tar命令
tar命令是Linux系統中最常見的打包文件的命令。
實例1:使用tar命令復制一個目錄的整體結構
[root@rs1 mnt]# tar cf - /mnt/ | (cd /backup; tar xf -)實例2:檢查tar歸檔文件的大小
[root@rs1 mnt]# cd /;tar cf - etc | wc -c 18554880實例3:檢查tar歸檔文件壓縮為tar.gz歸檔文件后大小
[root@rs1 ~]# tar czf - fsx.tar | wc -c 2367404 [root@rs1 ~]# tar czf - fsx.tar | du -sh 4.8M .實例4:檢查tar歸檔文件壓縮為tar.bz2歸檔后文件所占大小
[root@rs1 ~]# tar cjf - fsx.tar | wc -c 2386060 [root@rs1 ~]# tar cjf - fsx.tar | du -sh 4.8M .在管道中使用head命令
head命令可以指定只打印出前幾行輸出,默認為10行
實例1:顯示ls命令前3行輸出
[root@rs1 ~]# ls anaconda-ks.cfg fsx fsx.tar httpd-2.4.6-45.el7.x86_64.rpm httpd.state less sort.txt who.txt [root@rs1 ~]# ls | head -n 3 anaconda-ks.cfg fsx fsx.tar在管道中使用paste命令
paste命令用于合并文件的行,也可以通過管道接受其他命令的輸出,并對其內容進行相應的合并處理
實例1:通古管道將file1文件和cat命令的輸出合并
[root@rs1 ~]# cat file1 | paste -d, - file2 fsx,狗肉 coco,狗肉湯 ,coco ,zzz [root@rs1 ~]# cat file1 fsx coco [root@rs1 ~]# cat file2 狗肉 狗肉湯 coco zzz實例2:通過管道使用paste命令將ls命令分成4列顯示
[root@rs1 ~]# ls | paste -d\\t - - - - anaconda-ks.cfg file1 file2 fsx fsx.tar httpd-2.4.6-45.el7.x86_64.rpm httpd.state less sort.txt who.txt在管道中使用sed命令
sed命令是流編輯器的簡稱
實例1:替換打印的輸出文本中的內容(將所有"f"字符替換成漢字"范")
[root@rs1 ~]# ls anaconda-ks.cfg file1 file2 fsx fsx.tar httpd-2.4.6-45.el7.x86_64.rpm httpd.state less sort.txt who.txt [root@rs1 ~]# ls | sed 's/f/范/' anaconda-ks.c范g 范ile1 范ile2 范sx 范sx.tar httpd-2.4.6-45.el7.x86_64.rpm httpd.state less sort.txt who.txt實例2:顯示/etc/paaaswd文件中除第3~10行意外的內容
[root@rs1 ~]# cat -n /etc/passwd | sed '3,10d'1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin11 games:x:12:100:games:/usr/games:/sbin/nologin12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin13 nobody:x:99:99:Nobody:/:/sbin/nologin14 dbus:x:81:81:System message bus:/:/sbin/nologin15 polkitd:x:999:998:User for polkitd:/:/sbin/nologin16 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin17 avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin18 postfix:x:89:89::/var/spool/postfix:/sbin/nologin19 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin20 kiosk:x:1000:1000:kiosk:/home/kiosk:/bin/bash21 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin實例3:只顯示/etc/passwd文件3~10行內容
[root@rs1 ~]# cat -n /etc/passwd | sed -n '3,10p'3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8 halt:x:7:0:halt:/sbin:/sbin/halt9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10 operator:x:11:0:operator:/root:/sbin/nologin在管道中使用sort命令
sort命令用于對文本內容按行進行排序,也可以通過管道對一個命令的輸出進行排序
實例1:將ls命令列出的文件按大小排序
[root@rs1 ~]# ls -l | sort -r -n -k5 -rw-r--r-- 1 root root 2478080 Jul 15 14:21 fsx.tar -rw-------. 1 root root 1239040 Jul 15 14:16 anaconda-ks.cfg -r--r--r-- 1 root root 1226816 Jul 10 23:05 httpd-2.4.6-45.el7.x86_64.rpm -rw-r--r-- 1 root root ? ? 387 Jul 15 00:59 httpd.state -rw-r--r-- 1 root root ? ? 180 Jul 15 01:24 who.txt -rw-r--r-- 1 root root ? ? 51 Jul 15 01:20 sort.txt -rw-r--r-- 1 root root ? ? 26 Jul 15 14:28 file2 -rw-r--r-- 1 root root ? ? ? 9 Jul 15 14:27 file1 -rw-r--r-- 1 root root ? ? ? 8 Jul 15 02:35 less -rw-r--r-- 1 root root ? ? ? 8 Jul 15 02:35 fsx total 4860實例2:將ps命令輸出按pid大小,羅列前10個
[root@rs1 ~]# ps -ax | sort -n | headPID TTY ? ? STAT ? TIME COMMAND1 ? ? ? ? Ss ? ? 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 232 ? ? ? ? S ? ? 0:00 [kthreadd]3 ? ? ? ? S ? ? 0:00 [ksoftirqd/0]5 ? ? ? ? S< ? ? 0:00 [kworker/0:0H]7 ? ? ? ? S ? ? 0:00 [migration/0]8 ? ? ? ? S ? ? 0:00 [rcu_bh]9 ? ? ? ? S ? ? 0:00 [rcuob/0]10 ? ? ? ? R ? ? 0:00 [rcu_sched]11 ? ? ? ? S ? ? 0:00 [rcuos/0]在管道中使用split命令
split命令將文件分割成塊,也可以通過管道將其他命令輸出的內容分割成指定大小的塊,并存入指定前綴的文件中
實例1:將ls命令的輸出按每5行為一塊,存入文件名前綴為lsroot的文件中
[root@rs1 ~]# ls | split -l 5 - lsroot [root@rs1 ~]# ls lsroota* lsrootaa lsrootab lsrootac [root@rs1 ~]# cat lsroota lsrootaa lsrootab lsrootac ? [root@rs1 ~]# cat lsrootaa | wc -l 5 [root@rs1 ~]# cat lsrootab | wc -l 5 [root@rs1 ~]# cat lsrootab httpd-2.4.6-45.el7.x86_64.rpm httpd.state less lsrootaa lsrootab實例2:將backup目錄按每5兆大小進行打包壓縮,生成的壓縮包文件名前綴為backup.tar.gz
[root@rs1 ~]# tar czf - etc | split -b 2m - backup.tar.gz. [root@rs1 ~]# ls anaconda-ks.cfg ? backup.tar.gz.ac file1 fsx.tar ? ? ? ? ? ? ? ? ? ? ? less ? ? lsrootac backup.tar.gz.aa backup.tar.gz.ad file2 httpd-2.4.6-45.el7.x86_64.rpm lsrootaa sort.txt backup.tar.gz.ab etc ? ? ? ? ? ? ? fsx ? httpd.state ? ? ? ? ? ? ? ? ? lsrootab who.txt [root@rs1 ~]# du -sh backup.tar.gz.a* 2.0M backup.tar.gz.aa 2.0M backup.tar.gz.ab 2.0M backup.tar.gz.ac 320K backup.tar.gz.ad在管道中使用strings命令
strings命令用于打印文件中的可打印字符串,常用來與grep命令配合使用,在二進制文件中查找字符串
實例1:查找uptime命令中GLIBC字符串
[root@rs1 ~]# strings /usr/bin/uptime | grep GLIBC GLIBC_2.3.4 GLIBC_2.4 GLIBC_2.2.5實例2:打印系統的BIOS信息
[root@localhost mnt]# dd if=/dev/mem bs=1k skip=768 count=256 | strings -n 32 2089Intel(R)Sandybridge Mobile PCI Accelerated SVGA BIOS Build Number: 2089(768_960) PC 14.34 10/30/2010 03:43:33 DECOMPILATION OR DISASSEMBLY PROHIBITED Copyright (C) 2000-2003 Intel Corp. All Rights Reserved. LFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelName LFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelNameLFP_PanelName+a Intel(R)Sandybridge Mobile Graphics Chipset Accelerated VGA BIOS Intel(R)Sandybridge Mobile Graphics Controller XXZZZ\\\```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqq}}}~~~ 256+0 records in 256+0 records out 262144 bytes (262 kB) copied, 0.00221095 s, 119 MB/s Phoenix Technology Ltd. Generic MP driver. Rev. 02, 12/06/2006 Boot From Floppy...$Boot From Hard Disk...$Boot From CD/DVD ROM...$Boot From PCMCIA...$Boot From USB...$Boot From Embedded Network...$Boot From BEV Device...$!!! UNSUPPORTED !!!$Booting BCV Device ## - Floppy$Booting BCV Device ## - Hard Disk$Booting BCV Device ## - CD/DVD$Booting BCV Device ## - PCMCIA/ExpressCard$Booting BCV Device ## - USB$Booting BEV Device ## - Network$Booting BEV Device ##$Calling INT 19h$Returned INT 19h$Copyright (c) 2007-2010 Phoenix Technologies Ltd. This program contains proprietary and confidential information. All rights reserved except as may be permitted by prior written $DISK BOOT FAILURE, INSERT SYSTEM DISK AND PRESS ENTER$` IDE HBA ver1.00 PHOENIX Tech Ltd ? ? ? ? ? ? ? ? (C) COPYRIGHT LENOVO 2005, 2010 ALL RIGHTS RESERVED IBM COMPATIBLE 486 BIOS COPYRIGHT Phoenix Technologies, Ltd在管道中使用tail命令
tail命令用于打印文件的最后幾行,和head相反。也可以用管道顯示其他命令輸出的最后即行內容。
實例1:顯示ls命令輸出的最后3行
[root@rs1 ~]# ls | tail -n 3 lsrootac sort.txt who.txt實例2:顯示/etc/passwd文件中UID最高的用戶信息
[root@rs1 ~]# sort /etc/passwd -t: -k3 -n | tail -n1 kiosk:x:1000:1000:kiosk:/home/kiosk:/bin/bash在管道中使用tee命令
tee命令用于存儲和查看任意其他命令的輸出。使用tee命令,你可以從一個輸入流讀取輸入,并分割輸出流到兩個重定向,所以輸出既顯示在屏幕,又重定向到文件中。
實例1:使用ls命令顯示目錄以file開頭的文件列表,并重定向到/tmo/ls.output文件中
[root@rs1 ~]# ls file* | tee /tmp/ls.out file1 file2 [root@rs1 ~]# cat /tmp/ls.out file1 file2實例2:在管道中的不同階段存儲命令中間結果
[root@rs1 ~]# ls | tee /tmp/ls.out | grep ^b | tee /tmp/stage2.txt | sort -r backup.tar.gz.ad backup.tar.gz.ac backup.tar.gz.ab backup.tar.gz.aa [root@rs1 ~]# cat /tmp/ls.out anaconda-ks.cfg backup.tar.gz.aa backup.tar.gz.ab backup.tar.gz.ac backup.tar.gz.ad etc file1 file2 fsx fsx.tar httpd-2.4.6-45.el7.x86_64.rpm httpd.state less lsrootaa lsrootab lsrootac sort.txt who.txt [root@rs1 ~]# cat /tmp/stage2.txt backup.tar.gz.aa backup.tar.gz.ab backup.tar.gz.ac backup.tar.gz.ad首先ls命令羅列除當前目錄所有內容,然后將輸出存儲到/tmp/ls_outfile中。再通過grep命令過濾出b開頭的文件,將輸出傳遞給第二個tee命令,輸出到終端,并保存只/tmp/stage2.txt文件中,并將輸出(這里輸出的只是終端顯示的部分,保存至stage2.txt文件中的內容不再作為輸出通過管道)使用sort反響排序。
在管道中使用tr命令
tr命令用于轉換和刪除字符
實例1:將所有的空白字符轉換為制表符
[root@rs1 ~]# echo "This is for testing" | tr [:space:] '\t' This is for testing實例2:刪除前一個命令輸出中的所有數字
[root@rs1 ~]# echo "This is for testing 1235" | tr -d [:digit:] This is for testing實例3:將前一個命令輸出中的所有字符轉換為大寫,并排序,使用tee顯示終端并保存至file1.txt文件中
[root@rs1 ~]# cat file1 | tr a-z A-Z | sort | tee file1.txt COCO FSX [root@rs1 ~]# cat file1.txt COCO FSX在管道中使用wc命令
wc命令用于統計在文本流中的字符數、單字數或字節數等
實例1:統計當前登陸到系統的用戶數
[root@rs1 ~]# who | wc -l 4 [root@rs1 ~]# who root ? ? pts/0 ? ? ? 2018-07-15 00:51 (fsx) root ? ? pts/1 ? ? ? 2018-07-15 00:51 (fsx) root ? ? pts/2 ? ? ? 2018-07-15 00:51 (fsx) root ? ? pts/3 ? ? ? 2018-07-15 00:51 (fsx)實例2:統計當前的Linux系統中的進程數
[root@rs1 ~]# ps -ef | wc -l 98 [root@rs1 ~]# ps -ax | wc -l 98小結
管道:將兩個或多個程序連接到一起,使得一個程序的輸出作為下一個程序的輸入,這樣連接的兩個或多個程序形成了管道
重定向符是將命令和文件連接,管道是將多個命令連接到一起
管道有一些特點:
命令的語法緊湊并使用簡單
多個命令串連,完成復雜任務
管道輸出的標準錯誤會混合到一起
幾個命令組合在一起,形成一個管道,這種方式使用的命令通常稱之為過濾器
如果Linux命令是從標準輸入接收數據,并在標準輸出上顯示數據,這個命令就被稱之為過濾器
過濾器通常和Linux管道一起使用
總結
以上是生活随笔為你收集整理的Linux中的管道和过滤器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python最适合做什么生意好-本周互联
- 下一篇: 【机器人栅格地图】基于灰狼算法求解栅格地