1. 程式人生 > >Shell指令碼學習指南(四)——文字處理工具

Shell指令碼學習指南(四)——文字處理工具

grep

  • 字串查詢,預設用BRE
  • grep [options] ‘string’ filename
  • -E 使用ERE
  • -a 以文字檔案方式搜尋
  • -c 計算找到的符合行的次數
  • -i 忽略大小寫
  • -n 順便輸出行號
  • -v 反向選擇,即顯示不包含匹配文字的所有行
  • -h 查詢多檔案時不顯示檔名
  • -l 查詢多檔案時只輸出包含匹配字元的檔名
  • -s 不顯示不存在或無匹配文字的錯誤資訊
grep -c "abc" test.txt #統計含有abc的行數
grep -i "May" test.txt #查詢含有May的行,不區分大小寫
grep -n "abc" test.txt #查詢含有abc的行,輸出時加上行號
grep -v "abc" test.txt #查詢不含有May的行 grep "a\{3,\}" test.txt #查詢至少重複出現3個a的行 grep "a\{3,7\}" test.txt #查詢重複出現3-7個a的行

tr

  • 字元轉換
  • -c:取反
  • -d:刪除
  • -s:把連續重複的字元以單獨一個字元表示
# 將檔案file中出現的"abc"替換為"xyz"
cat file | tr "abc" "xyz" > new_file

# 使用tr命令“統一”字母大小寫
cat file | tr [a-z] [A-Z] > new_file
cat file | tr [A-Z] [a-z] > new_file
# 把檔案中的數字0-9替換為a-j cat file | tr [0-9] [a-j] > new_file # 刪除檔案file中出現的"Snail"字元 cat file | tr -d "Snail" > new_file 【注意】這裡,凡是在file檔案中出現的'S','n','a','i','l'字元都會被刪除!而不是緊緊刪除出現的"Snail”字串 # 刪除檔案file中出現的換行'\n'、製表'\t'字元,不可見字元都得用轉義字元來表示 cat file | tr -d "\n\t" > new_file # 刪除“連續著的”重複字母,只保留第一個 cat file | tr -s [a-zA-Z] > new_file
# 刪除空行 cat file | tr -s "\n" > new_file # 刪除Windows檔案“造成”的'^M'字元 cat file | tr -d "\r" > new_file cat file | tr -s "\r" "\n" > new_file 【注意】這裡-s後面是兩個引數"\r""\n",用後者替換前者 # 用空格符\040替換製表符\011 cat file | tr -s "\011" "\040" > new_file # 把路徑變數中的冒號":",替換成換行符"\n" echo $PATH | tr -s ":" "\n"

cut

  • 從輸入中擷取選定的部分
  • -d 指定分隔符
  • -f 指定欄位
  • -c 指定字元
cut -d: -f1,7 /etc/passwd    #以:為分隔符,列印/etc/passwd的第1、第5欄位
who | cut -c 1-16,26-38      #列印/etc/passwd的第10-25字元

join

  • 基於共同的鍵值,合併記錄
  • -1 filed1 -2 filed2 指明要結合的欄位
  • -t 指定分隔符
1.txt:
aaa 1 2 3 4
bbb 1 2 3 4
xxx 1 2 3 4
ccc 1 2 3 4
ddd 1 2 3 4
ooo 1 2 3 4

2.txt:
aaa a b c d
bbb a b c d
zzz a b c d
ccc a b c d
ddd a b c d
yyy a b c d

join 1.txt 2.txt:
aaa 1 2 3 4 a b c d
bbb 1 2 3 4 a b c d

join -o 1.1 -o 1.2 -o 2.4 1.txt 2.txt
aaa 1 c
bbb 1 c

sort

  • 將輸入的文字排序
  • -b:忽略開頭的空白
  • -c:檢查輸入是否已經排序
  • -d:字典順序,僅文字、數字和空白有意義
  • -g:浮點值排序
  • -f:忽略大小寫
  • -i:忽略無法列印的字元
  • -k:定義排序鍵值
  • -m:將已排序的輸入檔案,合併為一個排序後的輸出資料流
  • -n:整數排序
  • -o:指定輸出檔案
  • -r:逆序排序
  • -t:指定分隔符
  • -u:只保留唯一的記錄
sort -t: -k2 /etc/passwd       #以:為分隔符,從第2個欄位開始,到記錄的結尾排序
sort -t: -k2,2 /etc/passwd     #以:為分隔符,從第2個欄位開始,到第2個欄位的結尾排序
sort -t: -k2,5 /etc/passwd     #以:為分隔符,從第2個欄位開始,到第5個欄位的結尾排序
sort -t: -k2.4,5.6 /etc/passwd #以:為分隔符,從第2個欄位的第4個字元開始,到第5個欄位的第6個字元排序
sort -t: -k3n,3 /etc/passwd    #以:為分隔符,以第3個欄位的整數值排序
sort -t: -k3nr,3 /etc/passwd   #以:為分隔符,以第3個欄位的整數值的逆序排序
sort -t: -k3n -k4n /etc/passwd #以:為分隔符,先以第3個欄位的整數值的逆序排序,在結果中對第4個欄位排序
sort -t: -k3n,3 -u /etc/passwd #以:為分隔符,以第3個欄位的整數值排序,在結果中只保留第一條

uniq

  • 資料過濾
  • -c:在每行前加上重複次數
  • -d:僅顯示重複的行
  • -u:僅顯示不重複的行

fmt

  • 重新格式化段落
  • -s:僅切割較長的行
  • -w n:設定輸出寬度

wc

  • 字數統計工具
  • -l:行數
  • -c:位元組數
  • -w:字數
  • 顯示行首
  • -n

tail

  • 顯示行尾
  • -n
  • -f:每隔1秒顯示檔案的行尾,看日誌檔案時很有用;此選項不可用於指令碼

dd

od

file

strings

pr

文字處理命令

  • tr
  • grep
  • cut
  • join
  • sort
  • wc
  • pr
  • head
  • tail
  • od
  • dd
  • file
  • strings