Shell中的文本命令總結

  1. 正則表達式:
    在這裏插入圖片描述
  2. 在stdin中搜索匹配特定模式的文本行:
echo -e "this is a word\nnext line" | grep word
  1. 文件中搜索匹配特定模式的文本行
grep "d" 1.txt
  1. grep命令默認使用基礎正則表達式。
grep -E "[a-d]+" 1.txt
  1. 選項-o可以只輸出匹配到的文本:
echo this is a line. | egrep -o "[a-z]+\."
  1. 選項-v可以打印出不匹配字符d的所有行:
grep -v d 1.txt
  1. 選項-c能夠統計出匹配字符d的文本行數,只是匹配行的數量,不是匹配的次數:
grep -c d 1.txt
  1. 選項-b可以打印出匹配出現在行中的偏移。配合選項-o可以打印出匹配所在字符或字節偏移。
echo fff ee aa zs | grep -b -o "ee"
  1. 需要在多級目錄對文本d進行遞歸搜索
grep "d" . -R -n

命令中的.指定了當前目錄。

  1. 使用-e可以匹配多個模式:
echo this is a line of text | grep -o -e "ts" -e "a"
  1. grep可以在搜索過程中使用通配符指定(include)或排除(exclude)某些文件。
    使用–include選項在目錄中遞歸搜索所有的.c和.cpp文件:
grep "main()" . -r --include *.{c,cpp}

在這裏插入圖片描述
13. 有時候並不打算查看匹配的字符串,而是想知道能否成功匹配。這可以通過設置grep的靜默選項(-q)來實現。0成功非0失敗。

  1. 選項-A可以打印匹配結果5之後的3行(包括5):
seq 10 | grep 5 -A 3
  1. 選項-B可以打印匹配結果之前的行。
  2. 選項-A和-B可以結合使用,或者也可以使用-C,匹配之前及之後的n行:
seq 10 | grep 5 -C 3
  1. cut命令可以按列,而不是按行來切分文件。該命令可用於處理使用固定寬度字段的文件、CSV文件或是空格分隔的文件。
cut -f 2,3 1.sh
  1. 打印2-3字符
cut -c 2-3 1.sh
  1. 打印前2個字符
cut -c -2 1.sh
  1. sed可以使用2替換3,匹配模式。
sed 's/2/3/' 2.txt
  1. 選項-i會使得sed用修改後的數據替換原始數據(不顯示在屏幕):
sed -i 's/h/ww/' 2.txt
  1. 之前的例子只替換了每行中模式首次匹配的內容。g標記可以使sed執行全局替換。
sed 's/w/33/g' 2.txt
  1. #g標記可以替換第N次出現的匹配:
echo thisthisthisthis | sed 's/this/THIS/2g'
  1. sed命令會將s之後的字符視爲命令分隔符。這允許我們更改默認的分隔符/:
echo thisthisthisthis | sed 's|this|THIS|3g'
  1. sed命令可以使用正則表達式作爲模式,另外還包含了大量可用於文本處理的選項。
  2. 使用指定的數字替換文件中所有1位數的數字,\b表示單詞邊界:
sed -i 's/\b[0-9]\{1\}\b/NUMBER/g' 2.txt
  1. 指定匹配給定模式的字符串。我們還可以使用#來指代出現在括號中的部分正則表達式所匹配到的內容:
echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'

這條命令將dight7替換爲7。(pattern)\用於匹配子串,在本例中匹配的子串是7。子模式被放入使用反斜線轉義過的()中。對於匹配到的第一個子串,對應的標記是\1,第二個是\2
28. 可以利用管道組合多個sed命令,多個模式之間可以用分號分隔

echo abc | sed 's/a/A/;s/c/C/'
  1. 如果要在sed表達式中使用變量,雙引號可以使用。
sed "s/$tezt/HELLO/"
  1. awk命令可以處理數據流。它支持關聯數組、遞歸函數、條件語句等功能。
  2. 輸出文件行數:
awk 'BEGIN {i=0 } { i++ } END { print i }' 1.sh
  1. awk命令的工作方式如下:
    a) awk命令首先執行BEGIN{}語句塊中的語句
    b) 接着從文件或stdin中讀取一行,如果能夠匹配pattern,則執行隨後的commands語句塊。重複這個過程,直到文件全部被讀取完畢。
    c) 當讀至輸入流末尾時,執行END{ commands }語句塊。
    BEGIN語句塊在awk開始從輸入流中讀取行之前被執行。

在這裏插入圖片描述
34. print $NF,打印一行中最後一個字段

  1. 使用NR統計文件的行數:
awk 'END{ print NR }' 1.sh

這裏只用到了END語句塊。每讀入一行,awk都會更新NR
37. 將外部變量值傳遞給awk

awk -v v=$var '{print v}'

或者:

 echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2 u
  1. awk有很多內建的字符串處理函數。
    length(string):返回字符串string的長度。
    index(string, search_string):返回search_string在字符串string中出現的位置。
    split(string, array, delimiter):以delimiter作爲分隔符,分割字符串string,
    將生成的字符串存入數組array。  substr(string, start-position, end-position) :返回字符串 string 中 以start-position和end-position作爲起止位置的子串。
    sub(regex, replacement_str, string):將正則表達式regex匹配到的第一處內容替換成replacment_str。
    gsub(regex, replacement_str, string):和sub()類似。不過該數會替換正則表達式regex匹配到的所有內容。
    match(regex, string):檢查正則表達式regex是否能夠在字符串string中找到匹配。如果能夠找到,返回非0值;否則,返回0。match()有兩個相關的特殊變量,分別是RSTART
    和RLENGTH。變量RSTART包含了匹配內容的起始位置,而變量RLENGTH包含了匹配內容的長度。
  2. egrep命令將文本文件轉換成單詞流,每行一個單詞。模式\b[[:alpha:]]+\b能夠匹配每個單詞並去除空白字符和標點符號。選項-o打印出匹配到的單詞,一行一個。
  3. 移除\n和\t:
tr -d ‘\n\t’
  1. 移除多餘的空格:
tr -s ‘’

或者:

sed ‘s/[ ]\+/ /g’
  1. 移除註釋:
sed ‘s:/\*.*\*/::g’

.*用來匹配//之間所有的文本
43. 按列合併:

paste 1.txt 2.txt
  1. 默認分隔符是製表符,也可以用-d指定分隔符:
paste 1.txt 2.txt -d ","
  1. 以逆序打印行:
tac 1.sh
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章