天天看點

初識shell文本處理工具之gawk-sedshell

shell

gawk

gawk選項

  • -F 指定行中分隔資料字段的字段分隔符
  • -f 指定處理程式的腳本名
  • -v var=value 定義gawk程式中的變量
  • -mf N 指定處理資料檔案中的最大行數
  • -mr N 指定資料檔案的最大資料行數

gawk資料字段變量

  • $0 表示整個文本行
  • $1 表示整個文本行中第一個資料字段
  • $2 表示整個文本行中第二個資料字段

一個簡單的案例

# BEGIN這是處理資料之前運作的腳本
BEGIN {
# 這是定義的變量,在以下其他階段的腳本中也可以調用,變量的調用方式如同shell中調用變量,但是不加$符号
separator1="           "

FS=":"
print "使用者名"separator1"密碼"separator1"使用者ID"separator1"組ID"separator1"使用者全名"separator1"主目錄"separator1"登入shell"separator1}

# 這是進行資料處理的腳本
{ 
print $1 separator1 $2 separator1 $3 separator1 $4 separator1 $5 separator1 $6 separator1 $7 separator1
}
# END這是資料處理最後要運作的腳本
END {
print "==========================THE END======================="
}
           

指定方式為:

[email protected]:~# gawk -f ./passwd.awk /etc/passwd
           

sed

替換标記

  • g: 全局替換
  • p: 列印替換後的行
  • 數字 表明新文本将替換地擠出模式比對的地方
  • w: 将替換的結果寫入到檔案中

替換字元

為了防止與某些特定的字元相沖突,sed支援選擇其他的字元進行分隔

sed 's!/bin/bash!/bin/csh' /etc/passwd
           

行尋址

  • 行的數字範圍
  • 用文本模式來過濾出某行

行尋址的使用格式

[address]command
           

也可以把特定位址的多個指令放在一起

address{
    command1
    command2
    command3
}
           

數字方式尋址

sed '2s/dog/cat/' data1'
sed '2,21s/dog/cat/' data1'
sed '2,$s/dog/cat/' data1'
           

文本模式尋址

sed '/admin/s/dog/cat' data2
           

組合指令

[email protected]:~# sed -n '2{s/daemon/admin/g;s/nologin/login/p}' /etc/passwd
admin:x:1:1:admin:/usr/sbin:/usr/sbin/login
           

删除行

sed 'd' data2 #删除data2中的所有記錄
sed '3d' data2 #删除data2中第三行
sed '4,$d' data2 #删除data2中第四行到最後的資料
sed '/line   1/d' data2 #删除模式比對到的行
sed '/1/,/2/d' data2 #比對到第一個打開行删除功能,比對到第二個執行行删除功能,并删除兩個比對到的行,如果第二個模式沒有被比對到,那麼整個檔案的資料都被删掉了
           

插入和附加文本

  • insert

    i

    在指定行前插入一個新行
  • append

    a

    在指定行後插入一個新行
[email protected]:~# echo "line" | sed 'i\linedemo'
linedemo
line
[email protected]:~# echo "line" | sed 'a\linedemo'
line
linedemo
           

但是在資料流中需要指定要插入或者要追加的位置

[email protected]:~# cat date2 
line1
line2
line3
[email protected]:~# sed '1i\demo' date2 
demo
line1
line2
line3
[email protected]:~# sed '2a\demo' date2 
line1
line2
demo
line3
# sed '1i\first line' date2 # 總是插入在第一行
# sed '$a\end line' date2 # 總是追加在最後一行
           

修改行

[email protected]:~# sed '3c\the change line' date2 
line1
line2
the change line
[email protected]:~# sed '1,$c\the change line' date2 
the change line
[email protected]:~# sed '1,2c\the change line' date2 
the change line
line3
[email protected]:~# sed '/line1/c\the change line' date2 
the change line
line2
line3
           

轉換指令

# 前面的數字與後面的字母一對一的進行轉換,1映射到a
[email protected]:~# sed 'y/123/abc/' date2 
linea
lineb
linec
[email protected]:~# sed '1,2y/123/abc/' date2 
linea
lineb
line3
           

回顧列印

  • 小寫p 用來列印文本行
  • 等号= 用來列印行号
  • 小寫l 用來列出行

列印文本行

[email protected]:~# head -3 /etc/passwd | sed 'p'
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
[email protected]:~# head -3 /etc/passwd | sed -n 'p'
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
           

列印行号

[email protected]:~# head -3 /etc/passwd | sed -n '='
1
2
3
[email protected]:~# head -3 /etc/passwd | sed '='
1
root:x:0:0:root:/root:/bin/bash
2
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
3
bin:x:2:2:bin:/bin:/usr/sbin/nologin
           

列出行

# 注意每行最後的一個$字元
[email protected]:~# head -3 /etc/passwd | sed -n 'l'
root:x:0:0:root:/root:/bin/bash$
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin$
bin:x:2:2:bin:/bin:/usr/sbin/nologin$
           

轉載于:https://blog.51cto.com/bkmaster/2120484