2016年11月17日 星期四

shell script的 字串處理,取代符號的用法,awk 以及 sed

awk

awk這個指令,可以用來處理字串,他的用法可以針對你想找的"符號"或"字串",來做切割然後可以單獨的取出,awk 使用說明如下

awk -F'要找的字符' '{print $1}'  

舉個實際例子,假設有個字串 =>  str="danny:12345:man"
那我現在想要取出danny,該怎麼做呢? 使用awk可以很簡的把他取出來
你只需下這段指令:
        echo $str | awk -F':' '{print $1}'





如果要取出12345,
        echo $str | awk -F':' '{print $2}'




如果要取出man,
        echo $str | awk -F':' '{print $3}'




如果是要取最後,也可以使用
        echo $str | awk -F':' '{print $NF}'

取倒數第二,寫法是
         echo $str | awk -F':' '{print $(NF-1)}'
        
        

sed

sed指令可以用來針對字串作以下功能  
1.以行為單位的新增/刪除   
2.以行為單位的取代與顯示
3.部分資料的搜尋並取代的功能

假設現在有一個檔案,名為hello,他的內容如下:










1.以行為單位的新增/刪除

(新增)我要印出hello的內容,並在第3行後面(也就是第四行)新增一些文字,作法如下:
       cat hello | sed '3a danny' 










(刪除)我要印出hello的內容,並刪除2~5行,作法如下:
       cat hello | sed '2,5d' 








2.以行為單位的取代與顯示

(取代)我要把2~5行取代為別的內容,作法如下:
       cat hello | sed '2,5c HHHHHHHHHHH' 






(顯示)我只要顯示2~5行的內容,作法如下:
       cat hello | sed -n '2,5p'







另外補充 sed 帶入變數的取某一行的方法
例如我有個變數$count="2"
我要用這個變數來取第二行,作法如下:
sed -n "${count}p"  ==> 等同於 sed -n "2p"


3.部分資料的搜尋並取代的功能

作法如下:
sed 's/要被取代的字串/新的字串/g'


例如有個字串 => str="@danny",假設我想要改成 "Hi danny",作法如下:
       echo $str | sed 's/@/Hi /g'





假設我只想要改成"danny",作法如下:
       echo $str | sed 's/@//g'





另外補充 sed 帶入變數的取代法
假設我有有個字串 => str="0.1.20180709", 我有個變數 $Date="20180709",
現在我要把str後面的".20180709"去掉, 作法如下:
       echo $str | sed "s/.$Date//g"



最後附上一個shell script範例,此範例是從一個json格式的字串中截取出user_name, passwd然後再透過smbpasswd指令去更改Samba的密碼

=================== test.sh ==========================
#!/bin/sh

input='{"user":"danny","passwd":"1234"}'
user_name=$(echo $input | awk -F',' '{print $1}' | awk -F':' '{print $2}' | sed 's/"//g')
passwd=$(echo $input | awk -F',' '{print $2}' | awk -F':' '{print $2}' | sed 's/"//g' | sed 's/}//g' )
printf "$passwd\n$passwd\n" | smbpasswd -a -s "$user_name" > /dev/null

==================================================




沒有留言:

張貼留言