- 正則表達式:
- 在stdin中搜索匹配特定模式的文本行:
echo -e "this is a word\nnext line" | grep word
- 文件中搜索匹配特定模式的文本行
grep "d" 1.txt
- grep命令默認使用基礎正則表達式。
grep -E "[a-d]+" 1.txt
- 選項-o可以只輸出匹配到的文本:
echo this is a line. | egrep -o "[a-z]+\."
- 選項-v可以打印出不匹配字符d的所有行:
grep -v d 1.txt
- 選項-c能夠統計出匹配字符d的文本行數,只是匹配行的數量,不是匹配的次數:
grep -c d 1.txt
- 選項-b可以打印出匹配出現在行中的偏移。配合選項-o可以打印出匹配所在字符或字節偏移。
echo fff ee aa zs | grep -b -o "ee"
- 需要在多級目錄對文本d進行遞歸搜索
grep "d" . -R -n
命令中的.指定了當前目錄。
- 使用-e可以匹配多個模式:
echo this is a line of text | grep -o -e "ts" -e "a"
- grep可以在搜索過程中使用通配符指定(include)或排除(exclude)某些文件。
使用–include選項在目錄中遞歸搜索所有的.c和.cpp文件:
grep "main()" . -r --include *.{c,cpp}
13. 有時候並不打算查看匹配的字符串,而是想知道能否成功匹配。這可以通過設置grep的靜默選項(-q)來實現。0成功非0失敗。
- 選項-A可以打印匹配結果5之後的3行(包括5):
seq 10 | grep 5 -A 3
- 選項-B可以打印匹配結果之前的行。
- 選項-A和-B可以結合使用,或者也可以使用-C,匹配之前及之後的n行:
seq 10 | grep 5 -C 3
- cut命令可以按列,而不是按行來切分文件。該命令可用於處理使用固定寬度字段的文件、CSV文件或是空格分隔的文件。
cut -f 2,3 1.sh
- 打印2-3字符
cut -c 2-3 1.sh
- 打印前2個字符
cut -c -2 1.sh
- sed可以使用2替換3,匹配模式。
sed 's/2/3/' 2.txt
- 選項-i會使得sed用修改後的數據替換原始數據(不顯示在屏幕):
sed -i 's/h/ww/' 2.txt
- 之前的例子只替換了每行中模式首次匹配的內容。g標記可以使sed執行全局替換。
sed 's/w/33/g' 2.txt
- #g標記可以替換第N次出現的匹配:
echo thisthisthisthis | sed 's/this/THIS/2g'
- sed命令會將s之後的字符視爲命令分隔符。這允許我們更改默認的分隔符/:
echo thisthisthisthis | sed 's|this|THIS|3g'
- sed命令可以使用正則表達式作爲模式,另外還包含了大量可用於文本處理的選項。
- 使用指定的數字替換文件中所有1位數的數字,\b表示單詞邊界:
sed -i 's/\b[0-9]\{1\}\b/NUMBER/g' 2.txt
- 指定匹配給定模式的字符串。我們還可以使用#來指代出現在括號中的部分正則表達式所匹配到的內容:
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/'
- 如果要在sed表達式中使用變量,雙引號可以使用。
sed "s/$tezt/HELLO/"
- awk命令可以處理數據流。它支持關聯數組、遞歸函數、條件語句等功能。
- 輸出文件行數:
awk 'BEGIN {i=0 } { i++ } END { print i }' 1.sh
-
awk命令的工作方式如下:
a) awk命令首先執行BEGIN{}語句塊中的語句
b) 接着從文件或stdin中讀取一行,如果能夠匹配pattern,則執行隨後的commands語句塊。重複這個過程,直到文件全部被讀取完畢。
c) 當讀至輸入流末尾時,執行END{ commands }語句塊。
BEGIN語句塊在awk開始從輸入流中讀取行之前被執行。
34. print $NF
,打印一行中最後一個字段
- 使用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
- 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包含了匹配內容的長度。 - egrep命令將文本文件轉換成單詞流,每行一個單詞。模式\b[[:alpha:]]+\b能夠匹配每個單詞並去除空白字符和標點符號。選項-o打印出匹配到的單詞,一行一個。
- 移除\n和\t:
tr -d ‘\n\t’
- 移除多餘的空格:
tr -s ‘’
或者:
sed ‘s/[ ]\+/ /g’
- 移除註釋:
sed ‘s:/\*.*\*/::g’
.*用來匹配/與/之間所有的文本
43. 按列合併:
paste 1.txt 2.txt
- 默認分隔符是製表符,也可以用-d指定分隔符:
paste 1.txt 2.txt -d ","
- 以逆序打印行:
tac 1.sh