1. 程式人生 > >sed && awk工具 及一些常用的shell指令碼

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

(二)awk

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

awk -F:'{print $1}' /etc/passwd
awk -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指令碼,更多的例項在我的上。

(1)比較大小

#!/bin/bash

echo "please input the two numbers:"
read a
read b
if (($a==$b));then
    echo "a = b"
elif (($a>$b));then
    echo "a > b"
else
    echo "a < b"
fi
(2)查詢檔案
#!/bin/bash

echo "Enter a file name :"
read a
if [ -e /home/tach/$a ];then
    echo "the file is exist!"
else
    echo "the file is not exist!"
fi
(3)刪除大小為0的檔案
#!/bin/bash

for filename in `ls`
do 
        a=$(ls -l $filename | awk '{print $5}')
        if ((a==0));then
            rm $filename
        fi
done

(4)檢視本機IP地址

#!/bin/bash

ifconfig | grep "inet 地址:" | awk '{print $2}' | sed 's/地址:'//g

(5)IP地址合法性判斷

#!/bin/bash

CheckIPAddr()
{
   #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."
    exit
else
    CheckIPAddr $1
    ans=$?
    if [ $ans -eq 0 ];then
        echo "legal ip address."
    else
        echo "unlegal ip address."
    fi

fi

(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重啟apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart #每月的1,10,22日的4:45重啟apache
10 1 * * 6,0  /usr/local/etc/rc.d/lighttpd restart  #每週六、日的1:10重啟apache
0,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





相關推薦

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

(一)sed sed是一個精簡的、非互動式的流式編輯器,它在命令列中輸入編輯命令和指定檔名,然後在螢幕上檢視輸出。 逐行讀取檔案內容儲存在臨時緩衝區中,稱為“模式空間”(pattern space),

10 個實戰面試常用 Shell 指令碼編寫

注意事項 1)開頭加直譯器:#!/bin/bash 2)語法縮排,使用四個空格;多加註釋說明。 3)命名建議規則:變數名大寫、區域性變數小寫,函式名小寫,名字體現出實際作用。 4)預設變數是全域性的,在函式中變數local指定為區域性變數,避免汙染其他作用域。 5)有兩個命令能幫助我除錯指令碼:set -e

10 個面試實戰常用 Shell 指令碼

注意事項 1)開頭加直譯器:#!/bin/bash 2)語法縮排,使用四個空格;多加註釋說明。 3)命名建議規則:變數名大寫、區域性變數小寫,函式名小寫,名字體現出實際作用。 4)預設變數是全域性的,在函式中變數local指定為區域性變數,避免汙染其他作用域。 5)有兩個命令能幫助我除錯指令碼:se

Shell腳本 (四)正則表達式 grep sed awk 工具

config 定義 情況 輸入 example 其他 bin 大小 share 正則表達式定義正則表達式,又稱正規表達式、常規表達式是使用單個字符串來描述、匹配一系列符合某個句法規則的字符串·正則表達式組成普通字符大小寫字母、數字、標點符號及一些其他符號元字符在正則表達式中

8個實戰常用Shell指令碼編寫

注意事項: 1).開頭加直譯器:#!/bin/bash 2).語法縮排,使用四個空格,多加註釋說明 3).命名建議規範:變數名大寫,區域性變數小寫,函式名小寫 4).預設變數是全域性的,函式中使用local指定區域性變數 5).除錯指令碼兩個命令:set -e遇

Linux 常用命令sed/awk/grep正則表示式

sed 主要功能 sed,stream editor。是一個”非互動式“字元流編輯器。輸入流通過程式並輸出到標準輸出端。 sed主要用來自動編輯一個或者多個檔案(替換,插入,刪除,追加,更改) 常見應用 抽區域匹配正則表示式比較域增加,附加,替換 執行過程 sed一次處理一行或多行內容。處理時,把

CentOS 6.9配置網卡IP/網關/DNS命令詳細介紹一些常用網絡配置命令(轉)

linux. centos fly fig details oba routing href 修改dns 一、IP 即時生效(重啟後失效): ifconfig eth0 192.168.1.102 netmask 255.255.255.0 //添加IP地址 r

pycharm快捷鍵一些常用設置

ring 當前 高亮顯示 粘貼 cat 代碼塊 配置 ins log 1、pycharm快捷鍵及一些常用設置,方便隨時參閱。 Alt+Enter 自動添加包Ctrl+t SVN更新Ctrl+k SVN提交Ctrl + / 註釋(取消註釋)選擇的行Ctrl+Shift+F 高

Mysqlymlf設置root密碼,連接一些常用的命令

用戶 slist 生效 進入 sta usr TE 圖片 還需 一、mysql設置更改root密碼 1、把mysql加入PATH:export PATH=$PATH:/usr/local/mysql/bin讓變量永久生效:vim /etc/profile 把以上命令放入到最

pycharm 快捷鍵一些常用設置

ctrl+s ctrl+ 不能 aps 替換 喜歡 pla pyc Edito pycharm中的快捷鍵及一些常用設置 在PyCharm /opt/pycharm-3.4.1/help目錄下可以找到ReferenceCard.pdf快捷鍵英文版說明 PyCharm De

Java監控工具JVM常用引數

GC   Java技術體系中所提倡的自動記憶體管理最終可以歸結為自動化地解決了兩個問題:給物件分配記憶體以及回收分配給物件的記憶體。   而當需要排查各種記憶體溢位、記憶體洩漏問題時,當垃圾收整合為系統達到更高併發量的瓶頸時,我們就需要對那些“自動化”的技術實施必要的監控和調節,因

Linux常用Shell指令碼珍藏

我們在運維中,尤其是linux運維,都知道指令碼的重要性,指令碼會讓我們的 運維事半功倍,所以學會寫指令碼是我們每個linux運維必須學會的一門功課,這裡收藏linux運維常用的指令碼。如何學好指令碼,最關鍵的是就是大量的練習 和實踐。根據以下指令碼我們可以拓展,這樣我們提高

pycharm快捷鍵一些常用設定(轉載,侵刪)

轉載自: https://www.cnblogs.com/shizhengwen/p/6631527.html pycharm快捷鍵及一些常用設定(個人備忘) 在PyCharm /opt/pycharm-3.4.1/help目錄下可以找到ReferenceCard.pdf快捷鍵英文

Git 專案提交程式碼一些常用命令

在dev_ysg分支 : git add . //把專案新增到倉庫 git commit -m "test" // 提交加註釋 git push //推到dev_ysg分支上去 git checkout dev //

Git 項目提交代碼一些常用命令

結果 highlight space 一個 遠程 origin 回退版本 信息 javascrip 在dev_ysg分支 : git add . //把項目添加到倉庫 git commit -m "test" // 提交加註釋

Linux運維常用shell指令碼之使用者管理例項

1、用shell指令碼批量建立Linux使用者 實現要求:建立使用者student1到student50,指定組為student組!而且每個使用者需要設定一個不同的密碼! #!/bin/bash for i in `seq 1 50` do     useradd -G

pycharm快捷鍵一些常用設定

Alt+Enter 自動新增包 shift+O 自動建議程式碼補全 Ctrl+t SVN更新Ctrl+k SVN提交Ctrl + / 註釋(取消註釋)選擇的行Ctrl+Shift+F 高階查詢Ctrl+Enter 補全Shift + Enter 開始新行TAB Shift+

windows10 如何給應用程式設定快捷鍵一些常用好玩快捷鍵

自己經常使用截圖、畫圖、計算器等系統自帶的實用小工具,但是每次用滑鼠點來點去覺得很鬱悶,就上網百度加自己研究發現它們有些根本沒有快捷鍵需要主人自己進行設定,而且這次還發現了一些之前不怎麼使用的有用的w

EditText屬性一些常用用法

繼承關係: class EditText extends TextView android:inputType 在開發的過程中,通常會用到EditText,如何讓虛擬鍵盤來適應輸入框中內容的型別,通常我們都會在xml檔案中加入android

機器學習中 遠端終端模擬器 Xshell的使用,一些常用的命令

      在上一篇部落格中,我已經介紹瞭如何利用Pycharm 將我們的程式碼上傳至遠端伺服器上,在本篇部落格中,我將進一步介紹,如何使用終端模擬器Xshell 在自己的電腦上執行伺服器上的程式碼。Step 1  Xshell的下載及安裝在這裡我推薦安裝學生版的Xshell