天天看點

Linux管線指令 - cut,grep,sort,uniq,wc,tee,tr,col,join,paste,expand,split,xargs

Linux管線指令 - cut,grep,sort,uniq,wc,tee,tr,col,join,paste,expand,split,xargs

        在每個管線後面接的第一個資料必定是『指令』喔!而且這個指令必須要能夠接受 standard input 的資料才行,這樣的指令才可以是為『管線指令』,例如 less, more, head, tail 等都是可以接受 standard input 的管線指令啦。至于例如 ls, cp, mv 等就不是管線指令了!因為 ls, cp, mv 并不會接受來自 stdin 的資料。 也就是說,管線指令主要有兩個比較需要注意的地方:

    管線指令僅會處理 standard output,對于 standard error output 會予以忽略

    管線指令必須要能夠接受來自前一個指令的資料成為 standard input 繼續處理才行。

撷取指令: cut, grep

        什麼是撷取指令啊?說穿了,就是将一段資料經過分析後,取出我們所想要的。或者是經由分析關鍵詞,取得我們所想要的那一行! 不過,要注意的是,一般來說,撷取資訊通常是針對『一行一行』來分析的, 并不是整篇資訊分析的。

cut

        這個指令可以将一段資訊的某一段給他『切』出來~ 處理的資訊是以『行』為機關。

[[email protected] ~]# cut -d'分隔字元' -f fields <==用于有特定分隔字元
[[email protected] ~]# cut -c 字元區間            <==用于排列整齊的資訊
選項與參數:
-d  :後面接分隔字元。與 -f 一起使用;
-f  :依據 -d 的分隔字元将一段資訊分割成為數段,用 -f 取出第幾段的意思;
-c  :以字元 (characters) 的機關取出固定字元區間;

範例一:将 PATH 變量取出,我要找出第五個路徑。
[[email protected] ~]# echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games:
# 1 |    2   |  3  |    4    |       5      |     6        |    7

[[email protected] ~]# echo $PATH | cut -d ':' -f 5
# 如同上面的數字顯示,我們是以『 : 』作為分隔,是以會出現 /usr/local/bin 
# 那麼如果想要列出第 3 與第 5 呢?,就是這樣:
[[email protected] ~]# echo $PATH | cut -d ':' -f 3,5

範例二:将 export 輸出的資訊,取得第 12 字元以後的所有字元串
[[email protected] ~]# export
declare -x HISTSIZE="1000"
declare -x INPUTRC="/etc/inputrc"
declare -x KDEDIR="/usr"
declare -x 
.....(其他省略).....
# 注意看,每個資料都是排列整齊的輸出!如果我們不想要『 declare -x 』時,
# 就得這麼做:

[[email protected] ~]# export | cut -c 12-
HISTSIZE="1000"
INPUTRC="/etc/inputrc"
KDEDIR="/usr"

.....(其他省略).....
# 知道怎麼回事了吧?用 -c 可以處理比較具有格式的輸出資料!
# 我們還可以指定某個範圍的值,例如第 12-20 的字元,就是 cut -c 12-20 等等!

範例三:用 last 将顯示的登陸者的資訊中,僅留下使用者大名
[[email protected] ~]# last
root   pts/1    192.168.201.101  Sat Feb  7 12:35   still logged in
root   pts/1    192.168.201.101  Fri Feb  6 12:13 - 18:46  (06:33)
root   pts/1    192.168.201.254  Thu Feb  5 22:37 - 23:53  (01:16)
# last 可以輸出『賬号/終端機/來源/日期時間』的資料,并且是排列整齊的

[[email protected] ~]# last | cut -d ' ' -f 1
# 由輸出的結果我們可以發現第一個空白分隔的字段代表賬号,是以使用如上指令:
# 但是因為 root   pts/1 之間空格有好幾個,并非僅有一個,是以,如果要找出 
# pts/1 其實不能以 cut -d ' ' -f 1,2 喔!輸出的結果會不是我們想要的。
      

grep

        grep 則是分析一行資訊, 若當中有我們所需要的資訊,就将該行拿出來。

[[email protected] ~]# grep [-acinv] [--color=auto] '搜尋字元串' filename
選項與參數:
-a :将 binary 檔案以 text 檔案的方式搜尋資料
-c :計算找到 '搜尋字元串' 的次數
-i :忽略大小寫的不同,是以大小寫視為相同
-n :順便輸出行号
-v :反向選擇,亦即顯示出沒有 '搜尋字元串' 内容的那一行!
--color=auto :可以将找到的關鍵詞部分加上顔色的顯示喔!

範例一:将 last 當中,有出現 root 的那一行就取出來;
[[email protected] ~]# last | grep 'root'

範例二:與範例一相反,隻要沒有 root 的就取出!
[[email protected] ~]# last | grep -v 'root'

範例三:在 last 的輸出資訊中,隻要有 root 就取出,并且僅取第一欄
[[email protected] ~]# last | grep 'root' |cut -d ' ' -f1
# 在取出 root 之後,利用上個指令 cut 的處理,就能夠僅取得第一欄啰!

範例四:取出 /etc/man.config 内含 MANPATH 的那幾行
[[email protected] ~]# grep --color=auto 'MANPATH' /etc/man.config
....(前面省略)....
MANPATH_MAP     /usr/X11R6/bin          /usr/X11R6/man
MANPATH_MAP     /usr/bin/X11            /usr/X11R6/man
MANPATH_MAP     /usr/bin/mh             /usr/share/man
# 神奇的是,如果加上 --color=auto 的選項,找到的關鍵詞部分會用特殊顔色顯示喔!
      

排序指令: sort, wc, uniq

sort

[[email protected] ~]# sort [-fbMnrtuk] [file or stdin]
選項與參數:
-f  :忽略大小寫的差異,例如 A 與 a 視為編碼相同;
-b  :忽略最前面的空格符部分;
-M  :以月份的名字來排序,例如 JAN, DEC 等等的排序方法;
-n  :使用『純數字』進行排序(預設是以文字型态來排序的);
-r  :反向排序;
-u  :就是 uniq ,相同的資料中,僅出現一行代表;
-t  :分隔符,預設是用 [tab] 鍵來分隔;
-k  :以那個區間 (field) 來進行排序的意思

範例一:個人賬号都記錄在 /etc/passwd 下,請将賬号進行排序。
[[email protected] ~]# cat /etc/passwd | sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
# 鳥哥省略很多的輸出~由上面的資料看起來, sort 是預設『以第一個』資料來排序,
# 而且預設是以『文字』型态來排序的喔!是以由 a 開始排到最後啰!

範例二:/etc/passwd 内容是以 : 來分隔的,我想以第三欄來排序,該如何?
[[email protected] ~]# cat /etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
# 看到特殊字型的輸出部分了吧?怎麼會這樣排列啊?呵呵!沒錯啦~
# 如果是以文字型态來排序的話,原本就會是這樣,想要使用數字排序:
# cat /etc/passwd | sort -t ':' -k 3 -n
# 這樣才行啊!用那個 -n 來告知 sort 以數字來排序啊!

範例三:利用 last ,将輸出的資料僅取賬号,并加以排序
[[email protected] ~]# last | cut -d ' ' -f1 | sort
      

uniq

[[email protected] ~]# uniq [-ic]
選項與參數:
-i  :忽略大小寫字元的不同;
-c  :進行計數

範例一:使用 last 将賬号列出,僅取出賬号欄,進行排序後僅取出一位;
[[email protected] ~]# last | cut -d ' ' -f1 | sort | uniq

範例二:承上題,如果我還想要知道每個人的登陸總次數呢?
[[email protected] ~]# last | cut -d ' ' -f1 | sort | uniq -c
      1
     12 reboot
     41 root
      1 wtmp
# 從上面的結果可以發現 reboot 有 12 次, root 登陸則有 41 次!
# wtmp 與第一行的空白都是 last 的預設字元,那兩個可以忽略的!
      

        這個指令用來将『重複的行删除掉隻顯示一個』,舉個例子來說, 你要知道這個月份登陸你主機的使用者有誰,而不在乎他的登陸次數,那麼就使用上面的範例, (1)先将所有的資料列出;(2)再将人名獨立出來;(3)經過排序;(4)隻顯示一個! 由于這個指令是在将重複的東西減少,是以當然需要『配合排序過的檔案』來處理。

wc

[[email protected] ~]# wc [-lwm]
選項與參數:
-l  :僅列出行;
-w  :僅列出多少字(英文單字);
-m  :多少字元;

範例一:那個 /etc/man.config 裡面到底有多少相關字、行、字元數?
[[email protected] ~]# cat /etc/man.config | wc 
    141     722    4617
# 輸出的三個數字中,分别代表: 『行、字數、字元數』

範例二:我知道使用 last 可以輸出登陸者,但是 last 最後兩行并非賬号内容,
        那麼請問,我該如何以一行指令串取得這個月份登陸系統的總人次?
[[email protected] ~]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l 
# 由于 last 會輸出空白行與 wtmp 字樣在最底下兩行,是以,我利用
# grep 取出非空白行,以及去除 wtmp 那一行,在計算行數,就能夠了解啰!
      

雙向重導向: tee

Linux管線指令 - cut,grep,sort,uniq,wc,tee,tr,col,join,paste,expand,split,xargs

        tee 會同時将資料流分送到檔案去與螢幕 (screen);而輸出到螢幕的,其實就是 stdout ,可以讓下個指令繼續處理。

[[email protected] ~]# tee [-a] file
選項與參數:
-a  :以累加 (append) 的方式,将資料加入 file 當中!

[[email protected] ~]# last | tee last.list | cut -d " " -f1
# 這個範例可以讓我們将 last 的輸出存一份到 last.list 檔案中;

[[email protected] ~]# ls -l /home | tee ~/homefile | more
# 這個範例則是将 ls 的資料存一份到 ~/homefile ,同時螢幕也有輸出資訊!

[[email protected] ~]# ls -l / | tee -a ~/homefile | more
# 要注意! tee 後接的檔案會被覆寫,若加上 -a 這個選項則能将資訊累加。
      

字元轉換指令: tr, col, join, paste, expand

tr

        tr 可以用來删除一段資訊當中的文字,或者是進行文字資訊的替換!

[[email protected] ~]# tr [-ds] SET1 ...
選項與參數:
-d  :删除資訊當中的 SET1 這個字元串;
-s  :取代掉重複的字元!

範例一:将 last 輸出的資訊中,所有的小寫變成大寫字元:
[[email protected] ~]# last | tr '[a-z]' '[A-Z]'
# 事實上,沒有加上單引号也是可以運作的,如:『 last | tr [a-z] [A-Z] 』

範例二:将 /etc/passwd 輸出的資訊中,将冒号 (:) 删除
[[email protected] ~]# cat /etc/passwd | tr -d ':'

範例三:将 /etc/passwd 轉存成 dos 斷行到 /root/passwd 中,再将 ^M 符号删除
[[email protected] ~]# cp /etc/passwd /root/passwd && unix2dos /root/passwd
[[email protected] ~]# file /etc/passwd /root/passwd
/etc/passwd:  ASCII text
/root/passwd: ASCII text, with CRLF line terminators <==就是 DOS 斷行
[[email protected] ~]# cat /root/passwd | tr -d '\r' > /root/passwd.linux
# 那個 \r 指的是 DOS 的斷行字元,關于更多的字元,請參考 man tr
[[email protected] ~]# ll /etc/passwd /root/passwd*
-rw-r--r-- 1 root root 1986 Feb  6 17:55 /etc/passwd
-rw-r--r-- 1 root root 2030 Feb  7 15:55 /root/passwd
-rw-r--r-- 1 root root 1986 Feb  7 15:57 /root/passwd.linux
# 處理過後,發現檔案大小與原本的 /etc/passwd 就一緻了!
      

        其實這個指令也可以寫在『正規表示法』裡頭!因為他也是由正規表示法的方式來取代資料的! 以上面的例子來說,使用 [] 可以配置一串字呢!也常常用來取代檔案中的怪異符号! 例如上面第三個例子當中,可以去除 DOS 檔案留下來的 ^M 這個斷行的符号!這東西相當的有用!相信處理 Linux & Windows 系統中的人們最麻煩的一件事就是這個事情啦!亦即是 DOS 底下會自動的在每行行尾加入 ^M 這個斷行符号!這個時候我們可以使用這個 tr 來将 ^M 去除! ^M 可以使用 \r 來代替之!

col

[[email protected] ~]# col [-xb]
選項與參數:
-x  :将 tab 鍵轉換成對等的空格鍵
-b  :在文字内有反斜杠 (/) 時,僅保留反斜杠最後接的那個字元

範例一:利用 cat -A 顯示出所有特殊按鍵,最後以 col 将 [tab] 轉成空白
[[email protected] ~]# cat -A /etc/man.config  <==此時會看到很多 ^I 的符号,那就是 tab
[[email protected] ~]# cat /etc/man.config | col -x | cat -A | more
# 嘿嘿!如此一來, [tab] 按鍵會被取代成為空格鍵,輸出就美觀多了!

範例二:将 col 的 man page 轉存成為 /root/col.man 的純文字檔
[[email protected] ~]# man col > /root/col.man
[[email protected] ~]# vi /root/col.man
COL(1)          BSD General Commands Manual               COL(1)

N^HNA^HAM^HME^HE
     c^Hco^Hol^Hl - filter reverse line feeds from input

S^HSY^HYN^HNO^HOP^HPS^HSI^HIS^HS
     c^Hco^Hol^Hl [-^H-b^Hbf^Hfp^Hpx^Hx] [-^H-l^Hl _^Hn_^Hu_^Hm]
# 你沒看錯!由于 man page 内有些特殊按鈕會用來作為類似特殊按鍵與顔色顯示,
# 是以這個檔案内就會出現如上所示的一堆怪異字元(有 ^ 的)

[[email protected] ~]# man col | col -b > /root/col.man
      

        雖然 col 有他特殊的用途,不過,很多時候,他可以用來簡單的處理将 [tab] 按鍵取代成為空格鍵! 例如上面的例子當中,如果使用 cat -A 則 [tab] 會以 ^I 來表示。 但經過 col -x 的處理,則會将 [tab] 取代成為對等的空格鍵!此外, col 經常被利用于将 man page 轉存為純文字檔案以友善查閱的功能!如上述的範例二!

join

        join 看字面上的意義 (加入/參加) 就可以知道,他是在處理兩個檔案之間的資料, 而且,主要是在處理『兩個檔案當中,有 "相同資料" 的那一行,才将他加在一起』的意思。

[[email protected] ~]# join [-ti12] file1 file2
選項與參數:
-t  :join 預設以空格符分隔資料,并且比對『第一個字段』的資料,
      如果兩個檔案相同,則将兩筆資料聯成一行,且第一個字段放在第一個!
-i  :忽略大小寫的差異;
-1  :這個是數字的 1 ,代表『第一個檔案要用那個字段來分析』的意思;
-2  :代表『第二個檔案要用那個字段來分析』的意思。

範例一:用 root 的身份,将 /etc/passwd 與 /etc/shadow 相關資料整合成一欄
[[email protected] ~]# head -n 3 /etc/passwd /etc/shadow
==> /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

==> /etc/shadow <==
root:$1$/3AQpE5e$y9A/D0bh6rElAs:14120:0:99999:7:::
bin:*:14126:0:99999:7:::
daemon:*:14126:0:99999:7:::
# 由輸出的資料可以發現這兩個檔案的最左邊字段都是賬号!且以 : 分隔

[[email protected] ~]# join -t ':' /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash:$1$/3AQpE5e$y9A/D0bh6rElAs:14120:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:14126:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:14126:0:99999:7:::
# 透過上面這個動作,我們可以将兩個檔案第一字段相同者整合成一行!
# 第二個檔案的相同字段并不會顯示(因為已經在第一行了嘛!)

範例二:我們知道 /etc/passwd 第四個字段是 GID ,那個 GID 記錄在 
        /etc/group 當中的第三個字段,請問如何将兩個檔案整合?
[[email protected] ~]# head -n 3 /etc/passwd /etc/group
==> /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

==> /etc/group <==
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
# 從上面可以看到,确實有相同的部分喔!趕緊來整合一下!

[[email protected] ~]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group
0:root:x:0:root:/root:/bin/bash:root:x:root
1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:root,bin,daemon
2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:root,bin,daemon
# 同樣的,相同的字段部分被移動到最前面了!是以第二個檔案的内容就沒再顯示。
# 請讀者們配合上述顯示兩個檔案的實際内容來比對!
      

paste

        這個 paste 就要比 join 簡單多了!相對于 join 必須要比對兩個檔案的資料相關性, paste 就直接『将兩行貼在一起,且中間以 [tab] 鍵隔開』而已!

[[email protected] ~]# paste [-d] file1 file2
選項與參數:
-d  :後面可以接分隔字元。預設是以 [tab] 來分隔的!
-   :如果 file 部分寫成 - ,表示來自 standard input 的資料的意思。

範例一:将 /etc/passwd 與 /etc/shadow 同一行貼在一起
[[email protected] ~]# paste /etc/passwd /etc/shadow
bin:x:1:1:bin:/bin:/sbin/nologin        bin:*:14126:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:14126:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin    adm:*:14126:0:99999:7:::
# 注意喔!同一行中間是以 [tab] 按鍵隔開的!

範例二:先将 /etc/group 讀出(用 cat),然後與範例一貼上一起!且僅取出前三行
[[email protected] ~]# cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3
# 這個例子的重點在那個 - 的使用!那玩意兒常常代表 stdin 喔!
      

expand

就是在将 [tab] 按鍵轉成空格鍵。

[[email protected] ~]# expand [-t] file
選項與參數:
-t  :後面可以接數字。一般來說,一個 tab 按鍵可以用 8 個空格鍵取代。
      我們也可以自行定義一個 [tab] 按鍵代表多少個字元呢!

範例一:将 /etc/man.config 内行首為 MANPATH 的字樣就取出;僅取前三行;
[[email protected] ~]# grep '^MANPATH' /etc/man.config | head -n 3
MANPATH /usr/man
MANPATH /usr/share/man
MANPATH /usr/local/man
# 行首的代表标志為 ^ ,這個我們留待下節介紹!先有概念即可!

範例二:承上,如果我想要将所有的符号都列出來?(用 cat)
[[email protected] ~]# grep '^MANPATH' /etc/man.config | head -n 3 |cat -A
MANPATH^I/usr/man$
MANPATH^I/usr/share/man$
MANPATH^I/usr/local/man$
# 發現差别了嗎?沒錯~ [tab] 按鍵可以被 cat -A 顯示成為 ^I 

範例三:承上,我将 [tab] 按鍵配置成 6 個字元的話?
[[email protected] ~]# grep '^MANPATH' /etc/man.config | head -n 3 | \
>  expand -t 6 - | cat -A
MANPATH     /usr/man$
MANPATH     /usr/share/man$
MANPATH     /usr/local/man$
123456123456123456.....
# 仔細看一下上面的數字說明,因為我是以 6 個字元來代表一個 [tab] 的長度,是以,
# MAN... 到 /usr 之間會隔 12 (兩個 [tab]) 個字元喔!如果 tab 改成 9 的話,
# 情況就又不同了!這裡也不好了解~您可以多配置幾個數字來查閱就曉得!
      

分割指令: split

[[email protected] ~]# split [-bl] file PREFIX
選項與參數:
-b  :後面可接欲分割成的檔案大小,可加機關,例如 b, k, m 等;
-l  :以行數來進行分割。
PREFIX :代表前導符的意思,可作為分割檔案的前導文字。

範例一:我的 /etc/termcap 有七百多K,若想要分成 300K 一個檔案時?
[[email protected] ~]# cd /tmp; split -b 300k /etc/termcap termcap
[[email protected] tmp]# ll -k termcap*
-rw-r--r-- 1 root root 300 Feb  7 16:39 termcapaa
-rw-r--r-- 1 root root 300 Feb  7 16:39 termcapab
-rw-r--r-- 1 root root 189 Feb  7 16:39 termcapac
# 那個檔名可以随意取的啦!我們隻要寫上前導文字,小檔案就會以
# xxxaa, xxxab, xxxac 等方式來建立小檔案的!

範例二:如何将上面的三個小檔案合成一個檔案,檔名為 termcapback
[[email protected] tmp]# cat termcap* >> termcapback
# 很簡單吧?就用資料流重導向就好啦!簡單!

範例三:使用 ls -al / 輸出的資訊中,每十行記錄成一個檔案
[[email protected] tmp]# ls -al / | split -l 10 - lsroot
[[email protected] tmp]# wc -l lsroot*
  10 lsrootaa
  10 lsrootab
   6 lsrootac
  26 total
# 重點在那個 - 啦!一般來說,如果需要 stdout/stdin 時,但偏偏又沒有檔案,
# 有的隻是 - 時,那麼那個 - 就會被當成 stdin 或 stdout ~
      

參數代換: xargs

          xargs 是在做什麼的呢?就以字面上的意義來看, x 是加減乘除的乘号,args 則是 arguments (參數) 的意思,是以說,這個玩意兒就是在産生某個指令的參數的意思! xargs 可以讀入 stdin 的資料,并且以空格符或斷行字元作為分辨,将 stdin 的資料分隔成為 arguments 。 因為是以空格符作為分隔,是以,如果有一些檔名或者是其他意義的名詞内含有空格符的時候, xargs 可能就會誤判了。

[[email protected] ~]# xargs [-0epn] command
選項與參數:
-0  :如果輸入的 stdin 含有特殊字元,例如 `, \, 空格鍵等等字元時,這個 -0 參數
      可以将他還原成一般字元。這個參數可以用于特殊狀态喔!
-e  :這個是 EOF (end of file) 的意思。後面可以接一個字元串,當 xargs 分析到
      這個字元串時,就會停止繼續工作!
-p  :在運作每個指令的 argument 時,都會詢問使用者的意思;
-n  :後面接次數,每次 command 指令運作時,要使用幾個參數的意思。看範例三。
當 xargs 後面沒有接任何的指令時,預設是以 echo 來進行輸出喔!

範例一:将 /etc/passwd 内的第一欄取出,僅取三行,使用 finger 這個指令将每個
        賬号内容秀出來
[[email protected] ~]# cut -d':' -f1 /etc/passwd |head -n 3| xargs finger
Login: root                             Name: root
Directory: /root                        Shell: /bin/bash
Never logged in.
No mail.
No Plan.
......底下省略.....
# 由 finger account 可以取得該賬号的相關說明内容,例如上面的輸出就是 finger root
# 後的結果。在這個例子當中,我們利用 cut 取出賬号名稱,用 head 取出三個賬号,
# 最後則是由 xargs 将三個賬号的名稱變成 finger 後面需要的參數!

範例二:同上,但是每次運作 finger 時,都要詢問使用者是否動作?
[[email protected] ~]# cut -d':' -f1 /etc/passwd |head -n 3| xargs -p finger
finger root bin daemon ?...y
.....(底下省略)....
# 呵呵!這個 -p 的選項可以讓使用者的使用過程中,被詢問到每個指令是否運作!

範例三:将所有的 /etc/passwd 内的賬号都以 finger 查閱,但一次僅查閱五個賬号
[[email protected] ~]# cut -d':' -f1 /etc/passwd | xargs -p -n 5 finger
finger root bin daemon adm lp ?...y
.....(中間省略)....
finger uucp operator games gopher ftp ?...y
.....(底下省略)....
# 在這裡鳥哥使用了 -p 這個參數來讓您對于 -n 更有概念。一般來說,某些指令後面
# 可以接的 arguments 是有限制的,不能無限制的累加,此時,我們可以利用 -n
# 來幫助我們将參數分成數個部分,每個部分分别再以指令來運作!這樣就 OK 啦!^_^

範例四:同上,但是當分析到 lp 就結束這串指令?
[[email protected] ~]# cut -d':' -f1 /etc/passwd | xargs -p -e'lp' finger
finger root bin daemon adm ?...
# 仔細與上面的案例做比較。也同時注意,那個 -e'lp' 是連在一起的,中間沒有空格鍵。
# 上個例子當中,第五個參數是 lp 啊,那麼我們下達 -e'lp' 後,則分析到 lp
# 這個字元串時,後面的其他 stdin 的内容就會被 xargs 舍棄掉了!
      
範例五:找出 /sbin 底下具有特殊權限的檔名,并使用 ls -l 列出詳細屬性
[[email protected] ~]# find /sbin -perm +7000 | ls -l
# 結果竟然僅有列出 root 所在目錄下的檔案!這不是我們要的!
# 因為 ll (ls) 并不是管線指令的原因啊!

[[email protected] ~]# find /sbin -perm +7000 | xargs ls -l
-rwsr-xr-x 1 root root 70420 May 25  2008 /sbin/mount.nfs
-rwsr-xr-x 1 root root 70424 May 25  2008 /sbin/mount.nfs4
-rwxr-sr-x 1 root root  5920 Jun 15  2008 /sbin/netreport
....(底下省略)....      

繼續閱讀