sed && awk工具 及一些常用的shell指令碼

來源:互聯網
上載者:User

sed && awk工具 及一些常用的shell指令碼

(一)sed

sed是一個精簡的、非互動流式編輯器,它在命令列中輸入編輯命令和指定檔案名稱,然後在螢幕上查看輸出。

逐行讀取檔案內容儲存在臨時緩衝區中,稱為“模式空間”(pattern space),接著用sed命令處理緩衝區的內容,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行,這樣不斷重複,直到檔案末尾。原檔案愛你的內容並沒有改變。

 

sed '4,$d' test.in # 刪除4~最後一行sed '3q' test.in # 讀到指定行之後退出sed 's/public/PUBLIC/' test.in # 替換public為PUBLICsed -n 's/public/PUBLIC/p' test.in #列印匹配行
sed [options] sed_cmd files

 

-e 串連多個編輯命令
-f 指定sed指令檔名
-n 阻止輸入行自動輸出

通常grep也能達到效果,例如統計指定檔案中的行數
COUNT=$(cat $FILE | grep -a "關鍵字" | wc -l)

指定多個命令的三種方法:
1.用分號分隔命令

sed 's/public/PUBLIC/;s/north/NORTH/' test.in
2.每個命令前放置-e
sed -e 's/public/PUBLIC' -e 's/north/NORTH' test.in
3.使用分行命令功能,在輸入單引號後按Enter鍵就會出現多行提示符(>)
sed '> s/public/PUBLIC/> s/northNORTH' test.in

 

常用的定位命令:

常見的編輯命令:

p: 列印匹配行sed -n '3,5p' test,in=: 顯示匹配行的行號sed -n '/north/=' test.ind: 刪除匹配的行sed -n '/north/d' test.ina\: 在指定行之後追加一行或者多行文本,並顯示添加的新內容。sed '/north/a\AAA\>BBB\>CCC' test.ini\: 在指定行之前插入一行或者多行文本,並顯示新內容,同上。c\: 用新文本替換指定的行,使用格式同上l : 顯示指定行中的所有字元,包括控制字元(非列印字元)sed -n '/north/l' test.ins:替換命令,使用格式為[address] s/old/new/[gpw]address:如果省略,表示編輯所有的行g: 全域替換p: 列印被修改後的行w fname: 將被替換後的內容寫到指定的檔案中sed -n 's/north/NORTH/gp' test.insed -n 's/north/NORTH/w data' test.insed 's/[0-9][0-9]$/&.5/' datafile&符號用在替換字串中時,代表被替換的字串r: 讀檔案,將另外一個檔案中的內容附加到指定行後sed '$r data' test.inw: 寫檔案,將指定行寫入到另外一個檔案中sed -n '/public/w date2' test.inn: 將指定行的下面一行讀入編輯緩衝區sed -n '/public/{n;s/north/NORTH/p}' test.in對指定行同時使用多個sed編輯命令時,需用大括弧括起來,命令之間用分號;隔開。q:退出,讀取到指定行之後退出sedsed '3q' test.in

(二)awk

awk可以對列進行處理
簡單用法:
awk [options] sed_script files
-F 指定輸入記錄欄位的分隔字元,預設環境變數IFS的值
-f 從指定檔案讀取awk_script
-v 為awk設定變數

awk -F:'{print $1}' /etc/passwdawk -F:'/root{print $1 "|" $3}' /etc/passwd

 

awk的執行過程:
1. 如果存在BEGIN,awk首先執行他指定的actions
2. awk從輸入中讀取一行,稱為一條訊息記錄
3. awk將讀入的記錄分割成數個欄位,並將第一個欄位放入變數$1中,第二個放入變數$2中,依次類推;$0表示整條記錄;欄位分隔符號可以通過選項-F指定,否則使用預設的分隔字元。
4. 把當前輸入記錄依次與每一個awk_cmd中的pattern比較:
如果相匹配,就執行對應的actions
如果不匹配,就跳過對應的actions,直到完成所有的awk_cmd
5. 當一條輸入記錄記錄完畢後,awk讀取輸入的下一行,重複上面的處理過程,直到所有輸入全部處理完畢。
6. awk處理完所有的輸入後,若存在END,執行相應的actions
7. 如果輸入是檔案清單,awk將按順序處理列表中的每個檔案

awk處理的例子:

ifconfig | awk '/inet addr/{ print $2 }'| awk -F:'{ print $2 }'ifconfig | awk '/inet addr/{ print $2 }'|awk -F: 'BEGIN { print "begin..."}'{ print $2 } END { print "end..." }'
另外,awk還可以處理複合運算式:

 


最後,awk不僅是一個命令,它更是一個程式設計語言
變數:
1. 內部變數 awk '{print NR,$0}' #給檔案加上行號
2.自訂變數
函數:
1.內建函數
2.自訂函數
awk '{print sum($1,$2)} function sum(x,y){s=x+y;return s}' grade.txt
數組
awk 'BEGIN {print split("123#456",arr,"#");for(i in arr){print arr[i]}}'

由於這些比較複雜,本文不再展開介紹。

最後附上幾個簡單的shell指令碼,更多的執行個體在我的Github上。

(1)比較大小

#!/bin/bashecho "please input the two numbers:"read aread bif (($a==$b));then    echo "a = b"elif (($a>$b));then    echo "a > b"else    echo "a < b"fi
(2)尋找檔案
#!/bin/bashecho "Enter a file name :"read aif [ -e /home/tach/$a ];then    echo "the file is exist!"else    echo "the file is not exist!"fi
(3)刪除大小為0的檔案
#!/bin/bashfor filename in `ls`do         a=$(ls -l $filename | awk '{print $5}')        if ((a==0));then            rm $filename        fidone

(4)查看本機IP地址

#!/bin/bashifconfig | grep "inet 地址:" | awk '{print $2}' | sed 's/地址:'//g

(5)IP地址合法性判斷

#!/bin/bashCheckIPAddr(){   #IP地址需由三個.分隔且均是數字   echo $1 | grep "^[0-9]\{1,3\}\.\([0-9]\{1,3\}\.\)\{2\}[0-9]\{1,3\}$" > /dev/null   if [ $? -ne 0 ];then       return 1   fi   ipaddr=$1   a=`echo $ipaddr | awk -F. '{print $1}'`   b=`echo $ipaddr | awk -F. '{print $2}'`   c=`echo $ipaddr | awk -F. '{print $3}'`   d=`echo $ipaddr | awk -F. '{print $4}'`   for num in $a $b $c $d   do       if [ $num -gt 255 -o $num -lt 0 ];then           return 1       fi   done   return 0}if [ $# -ne 1 ];then    echo "Usage :$0 ipaddr."    exitelse    CheckIPAddr $1    ans=$?    if [ $ans -eq 0 ];then        echo "legal ip address."    else        echo "unlegal ip address."    fifi

(6)其他

#!/bin/bash#顯示當前日期和時間echo `date +%Y-%m-%d-%H:%M:%S`#查看哪個IP地址串連的最多netstat -an | grep ESTABLISHED | awk '{print $5}'|awk -F: '{print $1}' | sort | uniq -c#awk不排序重複資料刪除行awk '!x[$0]++' filename #x只是一個資料參數的名字,是一個map,做指定的邏輯判斷,如果邏輯判斷成立,則執行指定的命令;不成立,直接跳過這一行#查看最常使用的10個unix命令awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -rn | head -n 10#sort中的-r是降序,_-n是按照數值排序(預設比較字元,10<2)#逆序查看檔案cat 1.txt | awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }'#查看第3到6行awk 'NR >=3 && NR <=6' filename #crontab檔案的一些樣本30 21 * * * /usr/local/etc/rc.d/lighttpd restart #每晚9.30重啟apache45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart #每月的1,10,22日的4:45重啟apache10 1 * * 6,0  /usr/local/etc/rc.d/lighttpd restart  #每周六、日的1:10重啟apache0,30 18-23 * * *  /usr/local/etc/rc.d/lighttpd restart #表示在每天18.00至23.00之間每隔30分鐘重啟apache* 23-7/1 * * *  /usr/local/etc/rc.d/lighttpd restart #晚上11點到早上7點之間,每隔一小時重啟apache

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.