shell 知識點補充(2)-重新導向/ ; , &&, ||/管線命令/grep/sort/ uniq/wc/tee/tr/col/join/paste/expand/split/-

來源:互聯網
上載者:User

1、重新導向

1. 標準輸入(stdin) :代碼為 0 ,使用 < 或 << ;(重寫或追加)
2. 標準輸出(stdout):代碼為 1 ,使用 > 或 >> ;
3. 標準錯誤輸出(stderr):代碼為 2 ,使用 2> 或 2>> ;

eg:

yee@Loong:~$ ifconfig > 1.txt
yee@Loong:~$ vim 1.txt
yee@Loong:~$ ls -al 2.txt >>1.txt
ls: 無法訪問 2.txt: 沒有那個檔案或目錄
yee@Loong:~$ ls -al 2.txt 2>>1.txt
yee@Loong:~$ vim 1.txt
yee@Loong:~$ ls -al 1.txt 2.txt 2>>1.txt   錯誤的資料追加到1.txt
-rw-r--r-- 1 yee yee 922 10-18 08:56 1.txt

• 1> :是將正確的資料輸出到指定的地方去
• 2> :是將錯誤的資料輸出到指定的地方去

如果我只要正確的資料,錯誤的資訊我不要了呢?呵呵,這個時候 /dev/null 這個垃圾桶就很重要了!/dev/null 是什麼呢? 基本上,那就有點像是一個『黑洞』的垃圾桶功能!當你輸入的任何東西導向到這個虛擬垃圾桶裝置時, 『他就會憑空消失不見了~~』,這個東西有用的很!例如上面的例子中,我們可以這麼做,來將錯誤的資訊丟掉!
[dmtsai@linux ~]$ find /home -name testing > list_right 2> /dev/null
 error message 就會『不見了!』另外, 如果我要將資料都寫到同一個檔案中呢?這個時候寫法需要用到特殊寫法,請注意底下的寫法呦!
[dmtsai@linux ~]$ find /home -name testing > list 2> list <==錯誤寫法
[dmtsai@linux ~]$ find /home -name testing > list 2>&1 <==正確寫法
請特別留意這一點!同時寫入同一個檔案需要使用 2>&1 才對

< 又是什麼呀!?呵呵!以最簡單的說法來說, 那就是『將原本需要由鍵盤輸入的資料,經由檔案來讀入』的意思。 舉例來說,我們可以使用 cat 在鍵盤上面輸入一些資料,然後寫入一個檔案內,例如:
[root@linux ~]# cat > catfile
testing
cat file test
<==這裡按下 [ctrl]+d 結束輸入來離開!
此時就會有 catfile 這個檔案產生,而且該檔案的內容就是剛剛輸入的內容喔。 那麼,我是否可以使用其它檔案來取代鍵盤輸入呢?可以啊!這樣做!
[root@linux ~]# cat > catfile < somefile
我可以先編輯 somefile ,然後再以上述的指令來將資料輸出到 catfile 去呢!這樣可以理解了嗎? 能夠理解 < 之後,再來則是怪可怕一把的 << 這個連續兩個小於的符號了~ 他代表的是『結束的輸入字元』的意思!舉例來講:『我要用 cat 直接將輸入的訊息輸出到 catfile 中, 且當輸入 eof 時,該次輸入就結束』,那我可以這樣做:
[root@linux ~]# cat > catfile <<eof
> This is a test testing
> OK now stop
> eof <==輸入這個玩意兒,嘿!立刻就結束了!
看到了嗎?利用 << 右側的控制字元,我們可以終止一次輸入, 而不必輸入 [crtl]+d 來結束哩!這對程式寫作很有協助喔!好了,那麼為何要使用命令輸出重導向呢? 這個問題一定會困擾你一下下的,如果你從來都沒有寫過 script 的話!好了,我們來說一說吧!
• 當螢幕輸出的資訊很重要,而且我們需要將他存下來的時候;
• 背景執行中的程式,不希望他幹擾螢幕正常的輸出結果時;
• 一些系統的例行命令(例如寫在 /etc/crontab 中的檔案)的執行結果,希望他可以存下來時;
• 一些執行命令,我們已經知道他可能的錯誤訊息,所以想以『 2> /dev/null 』將他丟掉時;
• 錯誤訊息與正確訊息需要分別輸出時。

2、命令執行的判斷依據: ; , &&, ||

在指令與指令中間利用分號 (;) 來隔開,這樣一來,分號前的指令執行完後, 就會立刻接著執行後面的指令了。這真是方便啊~再來,換個角度來想, 萬一我想要在某個目錄底下建立一個檔案,也就是說,如果該目錄存在的話, 那我才建立這個檔案,如果不存在,那就算了~目錄是否存在可以使用一些 bash 提供的判斷式功能, 但這裡假設我不曉得那個指令,但我知道我可以使用 ls 來判斷是否有該目錄的存在, 也就是說,我可以利用 ls directoryname 判斷是否存在,然後以 touch 建立一個檔案, 這兩個指令有相關性,那該如何寫呢?呵呵!可以利用
&& 來作喔!

[root@linux ~]# ls /tmp && touch /tmp/testingagin
是否記得我們在變數的章節裡面談過這個奇怪的變數『 $? 』呢? 如果指令執行結果沒有錯誤訊息,那就會回傳 $?=0 ,如果有錯誤, 那回傳值就不會是 0 啊!經由這樣的判斷,我們也可以利用 && 來決定, 當前面的指令執行結果為正確 (例如:僅有 standard output 時),就可以接著執行後續的指令, 否則就予以略過!因此,當 ls /tmp 沒有問題,那麼就會接著執行 touch /tmp/testingagin 了! 萬一是這樣:
[root@linux ~]# ls /vbird && touch /vbird/test
因為我的系統裡面根本就不可能存在 /vbird 這個目錄呢!所以,執行 ls /vbird 就會回傳錯誤, 那麼後續的 touch /vbird/test 自然就不會動作囉!瞭解嗎? 再換個角度來想,如果我想要當某個檔案不存在時,就去建立那個檔案, 否則就略過呢?很簡單啊~可以這樣做:
[root@linux ~]# ls /tmp/vbirding || touch /tmp/vbirding

由於指令是一個接著一個去執行的,因此,如果真要使用判斷, 那麼這個 && 與 || 的順序就不能搞錯~一般來說,判斷式最多會有三個,也就是:
command1 && command2 || command3
而且順序通常不會變,因為一般來說, command2 與 command3 會放置肯定可以執行成功的指令

eg:

yee@Loong:~$ ls -al 1.txt && echo "1" ||echo "2"
-rw-r--r-- 1 yee yee 93 10-18 09:13 1.txt
1
yee@Loong:~$ ls -al 3.txt && echo "1" ||echo "2"
ls: 無法訪問 3.txt: 沒有那個檔案或目錄
2
yee@Loong:~$

3、管線命令 (pipe)

這個管線命令『 | 』僅能處理經由前面一個指令傳來的正確資訊,也就是 standard output ( STDOUT ) 的資訊,對於 stdandard error 並沒有直接處理的能力

cut
cut 不就是『切』嗎?沒錯啦!這個指令可以將一段訊息的某一段給他『切』出來~ 處理的訊息是以『行』為單位喔!底下我們就來談一談:
[root@linux ~]# cut -d'分隔字元' -f fields
[root@linux ~]# cut -c 字元區間
參數:
-d :後面接分隔字元。與 -f 一起使用;
-f :依據 -d 的分隔字元將一段訊息分割成為數段,用 -f 取出第幾段的意思;
-c :以字元 (characters) 的單位取出固定字元區間;
範例:
範例一:將 PATH 變數取出,我要找出第三個路徑。
[root@linux ~]# echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games:
[root@linux ~]# echo $PATH | cut -d ':' -f 5
# 嘿嘿!如此一來,就會出現 /usr/local/bin 這個目錄名稱!
# 因為我們是以 : 作為分隔字元,第五個就是 /usr/local/bin 啊!
# 那麼如果想要列出第 3 與第 5 呢?,就是這樣:
[root@linux ~]# echo $PATH | cut -d ':' -f 3,5
範例二:將 export 輸出的訊息,取得第 12 字元以後的所有字串
[root@linux ~]# export
declare -x HISTSIZE="1000"
declare -x INPUTRC="/etc/inputrc"
declare -x KDEDIR="/usr"
declare -x LANG="zh_TW.big5"
......其它省略......
[root@linux ~]# export | cut -c 12-
HISTSIZE="1000"
INPUTRC="/etc/inputrc"
KDEDIR="/usr"
LANG="zh_TW.big5"
......其它省略......
# 知道怎麼回事了吧?用 -c 可以處理比較具有格式的輸出資料!
# 我們還可以指定某個範圍的值,例如第 12-20 的字元,就是 cut -c 12-20 等等!
範例三:用 last 將這個月登入者的資訊中,僅留下使用者大名
[root@linux ~]# last
vbird tty1 192.168.1.28 Mon Aug 15 11:55 - 17:48 (05:53)
vbird tty1 192.168.1.28 Mon Aug 15 10:17 - 11:54 (01:37)
[root@linux ~]# last | cut -d ' ' -f 1
# 用 last 可以取得最近一個月登入主機的使用者資訊,
# 而我們可以利用空格符的間隔,取出第一個資訊,就是使用者帳號囉!
# 但是因為 vbird tty1 之間空格有好幾個,並非僅有一個,所以,如果要找出
# tty1 其實不能以 cut -d ' ' -f 1,2 喔!輸出的結果會不是我們想要的。
這個 cut 實在很好用!不過,說真的,除非你常常在分析 log 檔案,否則使用到 cut 的機會並不多!好了! cut 主要的用途在於將『同一行裡面的資料進行分解!』, 最常使用在分析一些資料或文字資料的時候!這是因為有時候我們會以某些字元當作分割的參數, 然後來將資料加以切割,以取得我們所需要的資料。我也很常使用這個功能呢!尤其是在分析 log 檔案的時候!不過, cut 在處理多空格相連的資料時,可能會比較吃力一點

grep

剛剛的 cut 是將一行訊息當中,取出某部分我們想要的,而 grep 則是分析一行訊息, 若當中有我們所需要的資訊,就將該行拿出來~簡單的文法是這樣的:
[root@linux ~]# grep [-acinv] '搜尋字串' filename
參數:
-a :將 binary 檔案以 text 檔案的方式搜尋資料
-c :計算找到 '搜尋字串' 的次數
-i :忽略大小寫不同,所以大小寫視為相同
-n :順便輸出行號
-v :反向選擇,亦即顯示出沒有 '搜尋字串' 內容的那一行!
範例:
範例一:將 last 當中,有出現 root 的那一行就取出來;
[root@linux ~]# last | grep 'root'
範例二:與範例一相反,只要沒有 root 的就取出!
[root@linux ~]# last | grep -v 'root'
範例三:在 last 的輸出訊息中,只要有 root 就取出,並且僅取第一欄
[root@linux ~]# last | grep 'root' |cut -d ' ' -f1
# 在取出 root 之後,利用上個指令 cut 的處理,就能夠僅取得第一欄囉!
grep 是個很棒的指令喔!他支援的文法實在是太多了~用在正規標記法裡頭, 能夠處理的資料實在是多的很。

sort
sort 是很有趣的指令,他可以幫我們進行排序,而且可以依據不同的資料型態來排序喔! 例如數字與文字的排序就不一樣。此外,排序的字元與語系的編碼有關,因此, 如果您需要排序時,建議使用 LC_ALL=C 來讓語系統一,資料排序比較好一些。
[root@linux ~]# sort [-fbMnrtuk]
參數:
-f :忽略大小寫差異,例如 A 與 a 視為編碼相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字來排序,例如 JAN, DEC 等等的排序方法;
-n :使用『純數字』進行排序(預設是以文字型態來排序的);
-r :反向排序;
-u :就是 uniq ,相同的資料中,僅出現一行代表;
-t :分隔字元,預設是 tab 鍵;
-k :以那個區間 (field) 來進行排序的意思,
範例:
範例一:個人帳號都記錄在 /etc/passwd 下,請將帳號進行排序。
[root@linux ~]# 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 內容是以 : 來分隔的,我想以第三欄來排序,該如何?
[root@linux ~]# cat /etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
iiimd:x:100:101:IIIMF server:/usr/lib/iiim:/sbin/nologin
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 ,將輸出的資料僅取帳號,並加以排序
[root@linux ~]# last | cut -d ' ' -f1 | sort
sort 同樣是很常用的指令呢!因為我們常常需要比較一些資訊啦! 舉個上面的第二個例子來說好了!今天假設你有很多的帳號,而且你想要知道最大的使用者 ID 目前到哪一號了!

• uniq

如果我排序完成了,想要將重複的資料僅列出一個顯示,可以怎麼做呢?
[root@linux ~]# uniq [-ic]
參數:
-i :忽略大小寫字元的不同;
-c :進行計數
範例:
範例一:使用 last 將帳號列出,僅取出帳號欄,進行排序後僅取出一位;
[root@linux ~]# last | cut -d ' ' -f1 | sort | uniq
範例二:承上題,如果我還想要知道每個人的登入總次數呢?
[root@linux ~]# last | cut -d ' ' -f1 | sort | uniq -c
這個指令用來將『重複的行刪除掉只顯示一個』,舉個例子來說, 你要知道這個月份登入你主機的使用者有誰,而不在乎他的登入次數,那麼就使用上面的範例, (1)先將所有的資料列出;(2)再將人名獨立出來;(3)經過排序;(4)只顯示一個! 由於這個指令是在將重複的東西減少,所以當然需要『配合排序過的檔案』來處理

• wc

如果我想要知道 /etc/man.config 這個檔案裡面有多少字?多少行?多少字元的話, 可以怎麼做呢?其實可以利用 wc 這個指令來達成喔!他可以幫我們計算輸出的訊息的整體資料!
[root@linux ~]# wc [-lwm]
參數:
-l :僅列出行;
-w :僅列出多少字(英文單字);
-m :多少字元;
範例:
範例一:那個 /etc/man.config 裡面到底有多少相關字、行、字元數?
[root@linux ~]# cat /etc/man.config | wc
138 709 4506
# 輸出的三個數字中,分別代表: 『行、字數、字元數』
範例二:我知道使用 last 可以輸出登入者,但是 last 最後兩行並非帳號內容,
那麼請問,我該如何以一行指令串取得這個月份登入系統的總人次?
[root@linux ~]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
# 由於 last 會輸出空白行與 wtmp 字樣在最底下兩行,因此,我利用
# grep 取出非空白行,以及去除 wtmp 那一行,在計算行數,就能夠瞭解囉

雙向重導向: tee


[root@linux ~]# tee [-a] file
參數:
-a :以累加 (append) 的方式,將資料加入 file 當中!
範例:
[root@linux ~]# last | tee last.list | cut -d " " -f1
# 這個範例可以讓我們將 last 的輸出存一份到 last.list 檔案中;
[root@linux ~]# ls -l /home | tee ~/homefile | more
# 這個範例則是將 ls 的資料存一份到 ~/homefile ,同時螢幕也有輸出訊息!
[root@linux ~]# ls -l / | tee -a ~/homefile | more
# 要注意: tee 後接的檔案會被覆蓋,所以,我們要加上 -a
# 這個參數才能將訊息累加。

• tr

tr 可以用來刪除一段訊息當中的文字,或者是進行文字訊息的替換!
[root@linux ~]# tr [-ds] SET1 ...
參數:
-d :刪除訊息當中的 SET1 這個字串;
-s :取代掉重複的字元!
範例:
範例一:將 last 輸出的訊息中,所有的小寫變成大寫字元:
[root@linux ~]# last | tr '[a-z]' '[A-Z]'
範例二:將 /etc/passwd 輸出的訊息中,將冒號 (:) 刪除
[root@linux ~]# cat /etc/passwd | tr -d ':'
範例三:將 DOS 檔案的斷行字元 ^M 符號刪除:
[root@linux ~]# cat /home/test/dostxt | tr -d '\r' > dostxt-noM
# 那個 /r 指的是 DOS 的斷行字元

• col

[root@linux ~]# col [-x]
參數:
-x :將 tab 鍵轉換成對等的空格鍵
範例:
[root@linux ~]# cat -A /etc/man.config <==此時會看到很多 ^I 的符號,那就是 tab
[root@linux ~]# cat /etc/man.config | col -x | cat -A | more
# 嘿嘿!如此一來, [tab] 按鍵會被取代成為空白格鍵,輸出就美觀多了!

join

join 看字面上的意義 (加入/參加) 就可以知道,他是在處理兩個檔案之間的資料, 而且,主要是在處理『兩個檔案當中,有 "相同資料" 的那一行,將他加在一起』的意思。我們利用底下的簡單例子來說明:
[root@linux ~]# join [-ti12] file1 file2
參數:
-t :join 預設以空格符分隔資料,並且比對『第一個欄位』的資料,
如果兩個檔案相同,則將兩筆資料聯成一行,且第一個欄位放在第一個!
-i :忽略大小寫差異;
-1 :這個是數位 1 ,代表『第一個檔案要用那個欄位來分析』的意思;
-2 :代表『第二個檔案要用那個欄位來分析』的意思。
範例:
範例一:用 root 的身份,將 /etc/passwd 與 /etc/shadow 相關資料整合成一欄
[root@linux ~]# join -t ':' /etc/passwd /etc/shadow
bin:x:1:1:bin:/bin:/sbin/nologin:*:12959:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:12959:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin:*:12959:0:99999:7:::
# 因為 /etc/shadow 的許可權問題,所以這裡必須是 root 才能動作!而 /etc/passwd
# 與 /etc/shadow 都是以 : 來分隔欄位,所以必須要使用 -t ':' 規範欄位分隔字元。
# 且,因為 /etc/shadow 與 /etc/passwd 剛好都是以第一個欄位為帳號名稱,所以,
# 就可以將同一行的資料給他貼在一起了!
# 另外,再仔細看一下 /etc/shadow 的內容與 /etc/passwd 的內容,您會發現,
# 兩者都以帳號為開始,而上面的輸出資料中您會發現特殊字型部分,那代表
# 第二個檔案的內容。在第二個檔案的內容部分,由於帳號(第一個欄位)與
# 第一的檔案是相同的,所以當然就省略掉,因此就成為上面的輸出。
範例二:我們知道 /etc/passwd 第四個欄位是 GID ,那個 GID 記錄在
/etc/group 當中的第三個欄位,請問如何將兩個檔案整合?
[root@linux ~]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group
0:root:x:0:root:/root:/bin/bash:root:x:
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
4:adm:x:3:adm:/var/adm:/sbin/nologin:adm:x:root,adm,daemon
# 這個例子就更明顯了!原本的 /etc/passwd 的第一行內容應該是:
# root:x:0:0:root:/root:/bin/bash
# 至於 /etc/group 第一行內容應該是:
# root:x:0:
# 我將第一個檔案的第四欄與第二個檔案的第三欄取出,放置到輸出的最前方,
# 然後將剩下的資料給他加在一起!

paste

 paste 就直接『將兩行貼在一起,且中間以 [tab] 鍵隔開』而已!簡單的使用方法:
[root@linux ~]# paste [-d] file1 file2
參數:
-d :後面可以接分隔字元。預設是以 [tab] 來分隔的!
- :如果 file 部分寫成 - ,表示來自 standard input 的資料的意思。
範例:
範例一:將 /etc/passwd 與 /etc/shadow 同一行貼在一起
[root@linux ~]# paste /etc/passwd /etc/shadow
bin:x:1:1:bin:/bin:/sbin/nologin bin:*:12959:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:12959:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin adm:*:12959:0:99999:7:::
# 注意喔!同一行中間是以 [tab] 按鍵隔開的!
範例二:先將 /etc/group 讀出(用 cat),然後與範例一貼上一起!且僅取出前三行
[root@linux ~]# cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3
# 這個例子的重點在那個 - 的使用!那玩意兒常常代表 stdin 喔!

• expand

這玩意兒就是在將 [tab] 按鍵轉成空格鍵啦:
[root@linux ~]# expand [-t] file
參數:
-t :後面可以接數字。一般來說,一個 tab 按鍵可以用 8 個空格鍵取代。
我們也可以自行定義一個 [tab] 按鍵代表多少個字元呢!
範例:
範例一:將 /etc/man.config 內行首為 MANPATH 的字樣就取出;僅取前三行;
[root@linux ~]# grep '^MANPATH' /etc/man.config | head -n 3
MANPATH /usr/man
MANPATH /usr/share/man
MANPATH /usr/local/man
# 行首的代表標誌為 ^ ,這個我們留待下節介紹!先有概念即可!
範例二:承上,如果我想要將所有的符號都列出來?(用 cat)
[root@linux ~]# 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 個字元的話?
[root@linux ~]# 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 的話,
# 情況就又不同了!這裡也不好理解~您可以多設定幾個數字來查閱就曉得!
expand 也是挺好玩的~他會自動將 [tab] 轉成空格鍵~所以,以上面的例子來說, 使用 cat -A 就會查不到 ^I 的字元囉~此外,因為 [tab] 最大的功能就是格式排列整齊! 我們轉成空格鍵後,這個空格鍵也會依據我們自己的定義來增加大小~ 所以,並不是一個 ^I 就會換成 8 個空白

分割命令: split

如果你有檔案太大,導致一些攜帶式裝置無法複製的問題,找 split 就對了! 他可以幫你將一個大檔案,依據檔案大小或行數來分割,就可以將大檔案分割成為小檔案了! 快速又有效啊!
[root@linux ~]# split [-bl] file PREFIX
參數:
-b :後面可接欲分割成的檔案大小,可加單位,例如 b, k, m 等;
-l :以行數來進行分割。
範例:
範例一:我的 /etc/termcap 有七百多K,若想要分成 300K 一個檔案時?
[root@linux ~]# cd /tmp; split -b 300k /etc/termcap termcap
[root@linux tmp]# ls -l termcap*
-rw-rw-r-- 1 root root 307200 8月 17 00:25 termcapaa
-rw-rw-r-- 1 root root 307200 8月 17 00:25 termcapab
-rw-rw-r-- 1 root root 184848 8月 17 00:25 termcapac
# 那個檔名可以隨意取的啦!我們只要寫上前置文字,小檔案就會以
# xxxaa, xxxab, xxxac 等方式來建立小檔案的!
範例二:如何將上面的三個小檔案合成一個檔案,檔名為 termcapback
[root@linux tmp]# cat termcap* >> termcapback
# 很簡單吧?就用資料流重導向就好啦!簡單!
範例三:使用 ls -al / 輸出的資訊中,每十行記錄成一個檔案
[root@linux tmp]# ls -al / | split -l 10 - lsroot
# 重點在那個 - 啦!一般來說,如果需要 stdout/stdin 時,但偏偏又沒有檔案,
# 有的只是 - 時,那麼那個 - 就會被當成 stdin 或 stdout ~

關於減號 - 的用途

管線命令在 bash 的連續的處理常式中是相當重要的!另外,在 log file 的分析當中也是相當重要的一環, 所以請特別留意!另外,在管線命令當中,常常會使用到前一個指令的 stdout 作為這次的 stdin , 某些指令需要用到檔案名稱 (例如 tar) 來進行處理時,該 stdin 與 stdout 可以利用減號 "-" 來替代, 舉例來說:
[root@linux ~]# tar -cvf - /home | tar -xvf -
上面這個例子是說:『我將 /home 裡面的檔案給他打包,但打包的資料不是紀錄到檔案,而是傳送到 stdout; 經過管線後,將 tar -cvf - /home 傳送給後面的 tar -xvf - 』。後面的這個 - 則是取用前一個指令的 stdout, 因此,我們就不需要使用 file 了!

摘自《鳥哥私房菜》

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.