Shell指令碼學習指南(四)——文字處理工具
阿新 • • 發佈:2019-01-29
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:字數
head
- 顯示行首
- -n
tail
- 顯示行尾
- -n
- -f:每隔1秒顯示檔案的行尾,看日誌檔案時很有用;此選項不可用於指令碼
dd
od
file
strings
pr
文字處理命令
- tr
- grep
- cut
- join
- sort
- wc
- pr
- head
- tail
- od
- dd
- file
- strings