Shell命令學習筆記
1. tr 替換字元
簡單樣本: tr 'A' 'a' < file.txt
把每一個A字元替換為a字元。tr命令只能用於單個字元的替換,如果寫成:
tr 'ABC' 'abc' < file.txt
則表示分別把A,B,C字元替換為a,b,c,而不是把字串ABC替換為abc,字串的替換需要用到sed命令,稍候會有介紹。
2. grep 字串尋找
簡單樣本 :grep world file.txt
在輸入檔案或這標準輸入中尋找含有匹配字串(此處是world)的行,並顯示改行。
用grep處理後的結果往往會成為後續處理的輸入,所以可以用管道進行串連:
grep world file.txt | wc -l
wc -l表示統計行數,上述命令表示統計file.txt檔案中含有world字串的行數。
上述命令等於 grep -c world file.txt
匹配多個條件,條件之間為或關係:
grep 'a\|b' file.txt
尋找file.txt檔案中所有含有a或者b的行
如果需要顯示不匹配模式的行,則只需要加-v 選項。
3. sed(Stream Editor),流編輯器,一般用於執行文本替換。
Sed是以批處理而不是互動的方式來編輯檔案,sed並不會修改源檔案,只會把修改的結果發送到標準輸出或者寫入另外一個檔案。
簡單樣本:sed 's/world/hadoop/' < file.txt
把每行中的第一個world替換成hadoop。
命令中引號內開頭的s表示要執行替換,sed的用途很多,但是一般用於文本替換。
主要選項:
-e 當需要有多個不同的替換時,每個替換命令必須以-e開頭:sed -e 's/world/hadoop/' -e 's/hello/hallo/' < file.txt
-f 當命令比較複雜時,可以把sed命令寫入一個指令檔(檔案中的命令不要加單引號),然後執行sed命令時只需用-f指向該指令檔即可:sed -f sed.txt < file.txt
-n 預設sed會把源檔案的修改結果發送到標準輸出(無論是否經過替換,都會發送),選項-n關閉該功能。-n一般和p組合使用,表示只列印替換過的行,其餘的行不列印:sed -n 's/world/hadoop/p' < file.txt
sed命令除了可以以p結尾之外,還可以以g結尾: sed 's/world/hadoop/g',表示全域替換,亦即對每行中所有匹配的文本進行替換,而不是僅僅替換第一個。
sed命令以數字結尾表示替換每行的第n個匹配字串: sed 's/world/hadoop/2'
應用:
刪除文本中所有空行:sed '/^$/d' file.txt
4. cut 選定欄位
cut用來剪下文字檔裡指定的欄位,欄位是指以定界符分隔的字串,常見的分隔字元有空格,定位字元以及冒號。
簡單樣本:
cut -d : -f 1,5 /etc/passwd
剪取/etc/passwd檔案的第1,5個欄位(欄位從1而不是0開始標號),定界符為冒號。
5. sort 排序工具
sort將輸入的每行看做一條記錄,每條記錄由多個欄位組成,欄位間以空白字元為間隔。
簡單樣本:
sort -t: -k1,1 /etc/passwd
以:為間隔符,以第一個欄位為排序欄位對檔案中的記錄進行排序
可以制定排序索引值欄位的類型,比如:
sort -t: -k1,1nr /etc/passwd
n是指把排序欄位當做數值而不是字串進行比較,如果指定了n,則2排在10前面,否則10排在2前面。
r是指逆序
其他常用的的排序索引值欄位類型為:
b 忽略開頭的空白
f 不區分大小寫
另外,如果k後唯寫了一個數字,比如-k2,則意味著排序索引值為第二個欄位及其以後的所有欄位,而不僅僅是第二個欄位,如果只想用第二個欄位作為排序索引值,則應該使用-k2,2。
當出現多個-k選項時,意味著首先用第一個k選項指定的索引值進行排序,然後對第一個索引值相同的一組記錄使用第二個索引值排序,以此類推。
最後,sort的排序是不穩定的。
6. wc WordCount工具
wc用來進行計數:
wc -c file.txt 統計位元組數
wc -w file.txt 統計單詞數
wc -l file.txt 統計行數
如果不指定任何選項,則是依次輸出行數,單詞數,位元組數。
7. head tail 取得檔案開頭或者結尾數行
head -n file.txt 輸出檔案的前n行
tail -n file.txt 輸出檔案的後n行
tail -n -f file.txt 輸出檔案的後n行,在檔案有新的資料加入時顯示新的資料(對查看log檔案非常有用)
8. Uniq 重複資料刪除
用例子說明,設檔案file.txt內容為:
a 1b 1c 2d 2e 3
則執行uniq -f 1 file.txt的結果為
a 1c 2e 3
執行uniq -u -f 1 file.txt的結果為
e 3
9. split 切分檔案
split -l 100 file.txt 把檔案file.txt按照100行為單位切分成數個檔案,切分後的檔案命名為xaa,xab,...
split -b 200k file.txt 把檔案file.txt按照200KB為單位進行切分,切分後的檔案命名為xaa,xab,...
參考文獻:
[1] Shell指令碼學習指南