linux shell 學習摘記(4)

onephone發表於2016-10-02

《linux shell 指令碼程式設計攻略 (第2版)》 第四章 “讓文字飛起來” 筆記

主要命令: 正規表示式, grep/egrep, sed, awk, cut, find, xargs, tr, 變數切片

  • 正規表示式 詳細參考

    1. ma(tri)?x 匹配max或matrix
    2. Oct (1st|2nd) 匹配 Oct 1st 或者 Oct 2nd
    3. 將正規表示式視覺化
  • grep

    1. grep -E "[a-z]+" filenameegrep "[a-z]+" filename;
    2. echo this is a line. | egrep -o "[a-z]+\." 只輸出檔案中匹配到的文字部分,-v`列印出匹配行之外的所有行
    3. grep -c "text" filename 統計匹配行的數量,並不是匹配數目; echo -e "1 2 3 4 \nhello\n 6" | egrep -o "[0-9]" | wc -l
    4. grep linux -n XXX包含匹配字串的行號;grep -b -o "not" XXX 列印模式匹配所位於的字元或位元組偏移
    5. grep -l linux sample1.txt sample2.txt 搜尋多個檔案並找出文字位於哪一個檔案中
    6. grep "text" . -R -n 遞迴搜尋, -i忽略大小寫
    7. grep -e "pattern" -e "pattern"匹配多個樣式
    8. grep -f pattern_filesource_filename 匹配模式檔案, --include *.{c, cpp}, --exclude "README"
    9. grep "test" file* -lz | xargs -0 rm 以0值位元組作為終結符的檔案(\0)
    10. 可打匹配結果前後的內容, 如seq 10 | grep 5 -A 3 匹配某結果之後的3行, -B匹配某個結果之前的幾行, -C 匹配某個結果之前和之後的幾行
  • cut -f3 --complement student_data.txt 列印出第3列之外的所有列

  • cut還可將一串指定的字元作為列來顯示 cut fields.txt -c1-3,6-9 --output-delimiter "," 提取第1-3字元為第一列6-9字元為第二列, 以,為區分, 還可更換引數為-b按位元組,-f`用於自定義欄位

  • sed

    1. sed: Stream Editor 預設情況下sed只會列印替換後的文字,若要同時儲存到原始檔需要-i選項, /在sed為定界符,同樣也可以使用:,|
    2. 移除空白行 sed -i "/^$/d" file
    3. sed -i 's/\b[0-9]\{3\}\b/NUMBER/g file.txt \b表示檔案邊界
    4. sed -i .bak 's/abc/def/' file sed執行替換時,會穿件一個名為file.bak的原始檔案副本
    5. 已匹配字串標記$, `echo this is an example | sed 's/\w+/[&]/g'
    6. 子串匹配標記(\1)
    7. 組合多個表示式 sed 'expression' | sed 'expression'sed 'expression;expression'sed -e 'expression' -e 'expression'
    8. sed 表示式通常用單引號引用,不過也可以用雙引號(有變數時會很有用)。其會先對錶達式求職然後在進行應用。 sed "s/$text/HELLO/"
  • awk

    1. awk指令碼被包含在單引號或雙引號之間
    2. 在awk中print的引數是以逗號進行分隔的,列印時以空格為定界符,而雙引號被作為拼接符,awk 'BEGIN { begin statements } pattern { commands } END { end statements }', awk '{ print 1 "-" 2 "-" 3;}', awk '{ print 1,2,3; }'
  • 壓縮或解壓JavaScript 下面是列子,並不能實際用 請依賴專業的工具

    1. 壓縮 cat sample.js | tr -d '\t\n' | tr -s ' ' | sed 's:/\*.*\*/::g' | sed "s/ \?\([{}();,:]\) \?/\1/g'
    2. 解壓 cat obfuscated.txt | sed 's/;/;\n/g' | sed 's/{/{\n\n/g' | sed 's/}/\n\n/g'
  • 按列合併多個檔案 paste file1.txt file2.txt -d ","

  • 列印檔案中的第五列 awk '{ print $5 }' filename, 列印當前目錄下各個檔案的許可權ls -l | awk '{ print $1 " : " $8 } filename

  • 對目錄中所有的文字進行替換

    1. find . -name *.cpp -print0 | xargs -I{} -0 | sed -i 's/Copyright/Copyleft/g' {}
    2. find . -name *.cpp -exec sed -i 's/Copyright/Copyleft/g' \{\} \; 為每一個超找到的檔案呼叫一次sed
    3. find . -name *.cpp -exec sed -i 's/Copyright/Copyleft/g' \{\} \+ 將多個檔名一併傳給sed
  • 切片

[root@share ~]# var=shiwenfeng
[root@share ~]# echo ${var/shi/yes/}
yes/wenfeng
[root@share ~]# echo ${var:4}
enfeng
[root@share ~]# echo ${var:4:2}
en
[root@share ~]# echo ${var:(-1)}
g
[root@share ~]# echo ${var:(-2):2}
ng
[root@share ~]#

相關文章