流編輯器:sedphp
參數:linux
動做:git
例子:
sed 's/pattern/replace_string/' file #從給定文本中的字符串利用正則表達式進行匹配並替換每一行中第一次符合樣式的內容
sed 's/text/replace/' file > newfile #替換每一行中第一次符合樣式的內容並將替換結果重定向到新文件
sed -i 's/test/replace/' file #參數-i使用替換每一行中第一次符合樣式的內容結果應用於源文件
sed 's/pattern/replace_string/g' file #後綴/g意味着會替換每一處匹配,而不是每一行中第一次匹配正則表達式
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl ./` #將當前目錄及子目錄下全部包含「原字符串」 的文件的行所有替換成「新字符串」shell
sed -i 's/max_execution_time = 30/max_execution_time = 300/g' /etc/php/php.ini #修改php配置文件的配置
sed 's:test:rep;ace:g' #使用:替換/,這兩個符號都是定界符,用其餘符號也無所謂,可是當定界符在匹配的樣式內部時,須要加\進行轉義
sed 'expression; expression' #組合多個表達式
sed '/^$/d' file #移除空白行,^$表示空白行,/d表示將匹配的樣式移除
echo thisthisthisthis | sed 's/this/THIS/2g' #後綴/2g表示從第2處開始(包括第二次)開始匹配。第N處,就使用/Ng。結果:thisTHISTHISTHIS
cat file | sed 's/pattern/replace_string/' file #從stdin中讀取輸入並替換每一行中第一次符合樣式的內容
echo this is an example | sed 's/\w\+/[&]/g' #符號&表示已匹配的字符串。正則表達式\w\+匹配每個單詞,並用[&]替換它,結果:[this] [is] [an] [example]
echo this is digit 7 in a number | sed '/digit \([0-9]\)/\l/' #參數\1(數字1)將digit 7轉換爲7express
---------------------------------------------------------------
text=hello
echo hello world | sed "s/$text/Hello/" #輸出結果HELLO world
---------------------------------------------------------------
文本混亂與恢復正常(替換空格,換行符,製表符等)
cat test.js | sed 's/;/;\n/g; s/{/{\n\n/g; s/}/\n\n}/g' # s/;/;\n/g將;替換爲\n; s/{/{\n\n/g將{替換爲{\n\n s/}/\n\n/g將}替換爲\n\n}
cat test.js | sed 's/;/;\n/g' |sed 's/{/{\n\n/g' | sed 's/}/\n\n}/g' #同上
sed 's/ [^.]*mobbile phones[^.]*\.//g' test.txt #移除文件test.txt中包含單詞「mobile phones」的句子json
數據流工具:awk數組
awk [選項參數] 'script' var=value file(s) 或 awk [選項參數] -f scriptfile var=value file(s)
選項參數:編輯器
工做方式:函數
awk 'BEGIN{ PRINT "start" } pattern { commands } END{print "END" } file
首先執行BEGIN語句塊,而後從文件或stdin中讀取一行,而後執行pattern{ commands }。直到文件所有讀取完畢。讀到輸入流末尾時,執行END{ commands } 語句塊。三個語句塊都是可選的。若是沒有提供pattern語句塊則默認打印每個讀取到行。
awk的特殊變量:
NR:表示記錄數量,在執行過程當中對應於當前行號。
NF:表示字段數量,在執行過程當中相對於當前行的字段數。
$NF:表示當前行的最後一個字段。$(NF-1)表示當前行的倒數第二個字段。依次類推
$0:這個變量包含執行過程當中當前行的文本內容。
$1:這個變量包含第一個字段的文本內容。
$2:這個變量包含第二個字段的文本內容。依次類推。
awk 'BEGIN { i=0 } { i++ } END{ print i }' filename #逐行讀取文件並打印行數
echo -e "line1\nline2" | awk 'BEGIN{ print "Start" } { print } END { print "END" } '
echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"-"var2"-"var3;}'
echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{ print "Line no:"NR",No of fields:"NF, "$0="$0,"$1="$1,"$2="$2,"$3="$3 }'
awk '{ print $3,$2 }' file #打印文件中每一行的第2和第3個字段。
awk 'END{ print NR }' file #統計文件中的行數,只加END語句塊表示文件執行到最後一行時再輸出行號
awk 'NR < 5' file #打印文件中行號小於5的行
awk 'NR==2,NR==5' file #打印文件中行號在2到5之間的行
awk '/linux/' file #打印文件中包含樣式linux的行(樣式能夠使用正則表達式)
awk '1/linux/' file #打印文件中不包含包含樣式linux的行
awk -F: '{ print $NF }' /etc/passwd #讀取並打印/etc/passwd文件的內容,設置定界符爲":",默認的定界符爲空格
var1='test'; var2='text' #(1)外部變量
echo | awk '{ print v1,v2 } v1=$var1 v2=var2 #(2)打印多個從標準輸入傳給awk的外部變量
awk '{ print v1,v2 }' v1=$var1 v2=var2 filename #(3)輸入來自文件
cat test.txt | getline output #將cat的輸出讀入變量output中。
awk 'BEGIN { FS=":" } { print $NF }' /etc/passwd #BEGIN語句塊中則使用FS="delimiter"設置輸出字段的定界符
awk '{arr[$1]+=1 }END{for(i in arr){print arr[i]"\t"i}}' FILE_NAME | sort -rn #統計每一個單詞的出現頻率並排序
seq 5 | awk 'BEGIN{ sum=0;print "Summation:" } { print $1"+"; sum+=$1 } END{ print "=="; print sum }' #將每一行第一個字段的值按照給定形式進行累加
echo | awk '{ "grep root /etc/passwd" | getline cmdout; print cmdout }' #經過getline將外部shell命令的輸出讀入變量cmdout。變量cmdout包括命令grep root /etc/passwdde 的輸出,而後打印包含root的行。
awk中使用循環與awk的內建函數
for(i=0;i<10;i++){ print $i; } 或者 for( i in array ) { print array[i]; }
length(string):返回字符串的長度
index(string ,search_string):返回search_string在字符串中出現的位置。
split(string, array, delimiter):用界定符生成一個字符串列表,並將該列表存入數組
substr(string, start-position, end-position):在字符串中用字符起止偏移量生成子串,並返回該子串。
sub(regex, replacement_str, string):將正則表達式匹配到的第一處內容替換成replacement_str。
gsub(regex, replacement_str, string):將正則表達式匹配到的全部內容替換成replacement_str。
match(regex ,string):檢查正則表達式是不可以匹配字符串,若能,返回非0值;不然,返回0.
awk '{print $1}' access.log |sort|uniq -c|sort -nr|head -10 #分析access.log得到訪問前10位的ip地址
awk -F '[,:]' '{if($6==140) print $0;}' test.log #對test.log中每行用「,」和「:」分割,並打印出分割後第6個字段等於140的行
cat *_login.log | awk -F[,:] '{if($24<1541260800) print $24;}' | wc -l #統計全部login日誌中時間戳(拆分後第24個字段)小於1541260800的行數
awk -F: '{print $15}' test.log | awk -F, '{print $1}' | awk '{for(i=0;i<NF;i++) sum+=$i;}END{print sum}' #對test.log的json行先用「:」分割再用「,」分割,再對某個字段累加
awk -F, '{print $14}' test.log | awk -F: '{print $2}' | awk '{for(i=0;i<NF;i++) sum+=$i;}END{print sum}' #對test.log的json行先用「,」分割再用「:」分割再對某個字段累加
awk -F '[,:]' '{print $28}' test.log | awk '{for(i=0;i<NF;i++) sum+=$i;}END{print sum}' #對test.log的json行分別用「,」和「:」分割後再對某個字段累加
awk -F[:,] '{print $28;}' pay.log | awk -F\" '{print $2;}' | awk '{for(i=0;i<NF;i++) sum+=$i;}END{print sum}' #做用同上,在拆分後字段還包含雙引號的狀況下,再次拆分,獲取數字再累加
---------------------------------------------------------------------------------------------------------------------------------------
文件:test.log 內如以下:
{"sid":1,"cid":1,"channel":140,"zid":0,"uid":"140524293334","role_id":"100252","goods_id":7,"cny":110000,"eventtime":1540244075}
{"sid":1,"cid":1,"channel":140,"zid":0,"uid":"140524293334","role_id":"100252","goods_id":7,"cny":120000,"eventtime":1540244075}
命令:
awk -F ':' '{print $9}' test.log | awk -F ',' '{print $1}' #先使用 「:」爲分隔符分割test.log每一行,而後獲取第9個字段,再用「,」爲分隔符分割字符串,再取第一個字段。
結果:
110000
120000
如果要統計該字段的累加數:
awk -F ':' '{print $9}' test.log | awk -F ',' '{print $1}' | awk '{for(i=1;i<=NF;i++) sum+=$i;} END{print sum}'
結果:
230000
----------------------------------------------------------------------------------------------------------------------------------------
替換工具:tr
tr [-cdst][--help][--version][第一字符集][第二字符集] tr [OPTION]…SET1[SET2]
參數:
例子:
echo 12345 | tr '0-9' '9876543210' #加密echo 87654 | tr '9876543210' '0-9' #解密echo "Hello 123 world 456" | tr -d '0-9' #使用-d將stdin中的數字刪除並打印出來cat test.txt | tr -d '0-9' #同上echo "hello 1 char 2 next 3 " | tr -d -c '0-9 \n' #參數-c是使用補集。刪除stdin中的全部數字和換行符以外的字符(這些字符是'0-9 \n'這個集合的補集)echo "this is a test !" | tr -s ' ' #參數-s壓縮多個空格爲單個------------------------------------------------tr能夠像使用集合同樣使用各類不一樣的字符類:alnum:字母和數字alpha:字母cntrl:控制(非打印)字符digit:數字graph:圖形字符lower:小寫字母print:可打印字符punct:標點符號space;空白字符upper:大寫字母xdigit:十六進制字符使用方式:tr [:class:] [:class:]例如:tr '[:lower:]' '[:upper:]' #將全部小寫字母換成大寫字母----------------------------------------------------