Linux三劍客 grep+awk+sed

Linux三劍客介紹

  • grep
    • global search regular expression(RE) and print out the line
    • 基于正則表達式查找滿足條件的行
  • awk
    • 名字來源于三個作者的名字簡稱
    • 根據(jù)定位到的數(shù)據(jù)行處理其中的分段
  • sed
    • stream editor
    • 根據(jù)定位到的數(shù)據(jù)行修改數(shù)據(jù)

Linux三劍客的價值

  • 三劍客
    • grep 數(shù)據(jù)查找定位
    • awk 數(shù)據(jù)切片
    • sed 數(shù)據(jù)修改
  • 類比SQL
    • grep= select * from table like '%xx'
    • awk=select field from table
    • sed=update table set field=new where field=old

grep

  • grep pattern file
  • grep -i pattern file 忽略大小寫
  • grep -v pattern file 不顯示匹配的行
  • grep -o pattern file 把每個匹配的內(nèi)容用獨立的行顯示
  • grep -E pattern file 使用擴展正則表達式
  • grep -A -B -C pattern file 打印命中數(shù)據(jù)的上下文
  • grep pattern -r dir/ 遞歸搜索

BRE基本正則表達式

  • ^ 開頭 $ 結(jié)尾
  • [a-z] [0-9] 區(qū)間,如果開頭帶有^表示不能匹配區(qū)間內(nèi)的元素
  • * 0個或多個
  • . 表示任意字符

ERE擴展正則表達式

  • 基本正則表達式(BRE)基礎(chǔ)上的擴展
  • ? 非貪婪匹配
  • + 一個或者多個
  • () 分組
  • {} 范圍約束
  • | 匹配多個表達式的任何一個

ERE開啟方法

image.png

awk

  • 介紹
    • Awk是linux下的一個命令,同時也是一種語言解析引擎
    • Awk具備完整的編程特性。比如執(zhí)行命令,網(wǎng)絡(luò)請求等
    • 精通awk,是一個linux工作者的必備技能語法
  • awk 'pattern{action}'

awk pattern語法

  • awk理論上可以代替grep
  • awk 'pattern{action}'
  • awk 'BEGIN{}END{}' 開始和結(jié)束
  • awk '/Running/' 正則匹配
  • awk '/aa/,/bb/' 區(qū)間選擇
  • awk '$2~/xxx/' 字段匹配
  • awk 'NR==2' 取第二行
  • awk 'NR>1' 去掉第一行

awk內(nèi)置變量

  • FS字段分隔符
  • OFS輸出數(shù)據(jù)的字段分隔符
  • RS記錄分隔符
  • ORS輸出字段的行分隔符
  • NF字段數(shù)
  • NR記錄數(shù)

awk的字段數(shù)據(jù)處理

  • -F 參數(shù)指定字段分隔符
  • BEGIN{FS="_"} 也可以表示分隔符
  • $0 代表當(dāng)前的記錄
  • $1代表第一個字段
  • $N 代表第N個字段
  • $NF代表最后一個字段
  • $(NF-1) 代表倒數(shù)第二個字段

awk字段分割

echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk -F/ '{print $1,$2,$3,$4}'
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{FS="/"}{print $1,$2,$3,$4}'
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{FS="/ | -"}{print $1,$2,$3,$4}'
image.png
  • 修改OFS和ORS讓$0重新計算
echo $PATH | awk 'BEGIN{FS=":";OFS=" | "}{$1=$1;print $0}'
echo $PATH | awk 'BEGIN{RS=":";ORS="^"}{print $0}'
image.png

awk行處理

  • 把單行分拆為多行
echo $PATH | awk 'BEGIN{RS=":"}{print $0}'
echo $PATH | awk 'BEGIN{RS=":"}{print NR,$0}'
echo $PATH | awk 'BEGIN{RS=":"}END{print NR}'
image.png
  • 多行組合為單行
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{ORS=":"}{print $0}'
image.png

數(shù)據(jù)計算

echo '1,10
2,20
3,30' | awk 'BEGIN{a=0;FS=","}{a+=$2}END{print a/NR}'
image.png

awk的詞典結(jié)構(gòu)

  • 提取包含”9”但是并不包含”study”的記錄
awk -F, '
/9/{if(member[$1]!=1) d[$1]=$0}
/study/{member[$1 ]=1; delete d[$1]}
END{for(k in d) print d[k]}
'file

sed

  • sed [addr ]X[options]
  • -e 表達式
  • sed -n '2p' 打印第二行
  • sed 's#hello#world#' 修改
  • -i 直接修改源文件
  • -E 擴展表達式
  • --debug 調(diào)試

pattern

  • 20 30,35行數(shù)與行數(shù)范圍
  • /pattern/ 正則匹配
  • //,// 正則匹配的區(qū)間,第一個表示開始命中,第二個表示結(jié)束命中,類似開閘放水

act1011

  • d刪除
  • p打印,通暢結(jié)合-n參數(shù):sed -n '2p'
  • 查找替換::s/REGEXP/REPLACEMENT/[FLAGS]
  • 分組匹配與字段提?。?code>sed 's#([0-9]*)|([a-z]*)#\1\2#'

sed使用

echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | sed 's#/#----#g'
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | sed -n '/^\ /bin/,/sbin/p'
sed -i '.bak' -e " -e "

三劍客實戰(zhàn)

  • 日志數(shù)據(jù)檢索
    • 找出log中的404 500的報錯考察嚴(yán)謹(jǐn)性
    • 找出500錯誤時候的上下文考察grep高級用法
      -日志數(shù)據(jù)統(tǒng)計
    • 找出訪問量最高的ip統(tǒng)計分析
  • 數(shù)據(jù)文件修改
    • 找出訪問量最高的頁面地址借助于sed的統(tǒng)計分析
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容