1. 程式人生 > >shell高階-----初識sed和gawk

shell高階-----初識sed和gawk

sed編輯器

sed說明

sed是Linux下一款功能強大的非互動流式文字編輯器,可以對文字檔案進行增、刪、改、查等操作,支援按行、按欄位、按正則匹配文字內容,靈活方便,特別適合於大檔案的編輯。

sed使用方法

sed的使用方法,呼叫sed 命令的語法有兩種:

一.在命令列指定sed指令對文字進行處理:sed +選項  ‘指令’ 檔案

二.先將sed指令儲存到檔案中,將該檔案作為引數進行呼叫:sed   +選項  -f  包含sed指令的檔案  檔案

sed的常用選項

-e:它告訴sed將下一個引數解釋為一個sed指令,只有當命令列上給出多個sed指令時才需要使用-e選項


-f:後跟儲存了sed指令的檔案

-i:直接對內容進行修改,不加-i時預設只是預覽,不會對檔案做實際修改

-n:取消預設輸出,sed預設會輸出所有文字內容,使用-n引數後只顯示處理過的行

sed中的編輯命令

a:追加  向匹配行後面插入內容

c:更改  更改匹配行的內容

i:插入  向匹配行前插入內容

d:刪除  刪除匹配的內容

s:替換  用斜線間指定的第二個文字字串來替代第一個文字字串。

[root@node3 ljy]# more ceshi.sh 
this is one!
[root@node3 ljy]# sed -i 's/one/two/' ceshi.sh   
[root@node3 ljy]# more ceshi.sh                
this is two!

預設情況下,只會替換一行中的第一處。要想替換一行中不同地方出現的檔案必須使用替換標記。

s/pattern/replacement/flags

有四種可用的替換標誌:

  • 數字:表明新檔案將替換第幾處模式匹配的地方,比如2,替換每行中第二次出現的文字
  • g :表明新檔案將會替換所有匹配的文字
  • p : 表明原先行的內容要打印出來 ,通常與sed的-n一起使用
  • w file :將替換的結果寫入到檔案中
[root@node3 ljy]# more ceshi.sh                  
this is one,one,one
[root@node3 ljy]# sed -i 's/one/two/2 ' ceshi.sh                                         
[root@node3 ljy]# more ceshi.sh                  
this is one,two,one
[root@node3 ljy]# sed -i 's/one/two/g ' ceshi.sh  
[root@node3 ljy]# more ceshi.sh                  
this is two,two,two


p:列印  打印出匹配的內容,通常與-n選項和用

=:用來列印被匹配的行的行號

n:讀取下一行,遇到n時會自動跳入下一行

r,w:讀和寫編輯命令,r用於將內容讀入檔案,w用於將匹配內容寫入到檔案

 

gawk程式

gawk提供了一種程式語言而不只是程式設計命令。

1、命令格式

gawk options program file*

options的可用選項有:

 -F fs 指定行中分隔資料欄位的欄位分隔符。個人不建議使用這個選項,在BEGIN塊中設定FS更好。這個選項只是提供了一個簡潔的設定方式。
 -f file:指定讀取程式的檔名
 -v var=value 定義gawk程式中的一個變數及其預設值。個人不建議使用這個選項,在BEGIN塊中設定更好。
 -mf N 指定要處理的資料檔案中的最大欄位數
 -mr N 指定資料檔案中的最大資料行數
 -W keyword 指定gawk的相容模式或警告等級

2、從命令列讀取指令碼

[root@node1 ~]# awk '{print "hello"}'
asd
hello
adf
hello
asd
hello
qqq
hello
[root@n

要終止這個gawk程式,你必須表明資料流已經結束,

ctrl+D組合鍵可以在bash中產生一個EOF字元。

3、使用資料欄位變數

預設情況下,gawk會將如下變數分配給它在文字中發現的資料欄位:

$0  代表整個文字行
$1  代表文字行的第一個資料段
$n  代表文字行的第n個數據段
$NF  代表文字行的最後一個數據段

gwak中預設的欄位分隔符書任意的空白字元。

[root@node1 ~]# df -h | gawk '{print $5}'
已用%
5%
0%
0%
1%
0%
14%
0%
[root@node1 ~]# df -h | gawk '{print $NF}'
掛載點
/
/dev
/dev/shm
/run
/sys/fs/cgroup
/boot
/run/user/0
[root@node1 ~]# df -h | gawk '{print $0}' 
檔案系統                 容量  已用  可用 已用% 掛載點
/dev/mapper/centos-root   42G  2.1G   40G    5% /
devtmpfs                 908M     0  908M    0% /dev
tmpfs                    920M     0  920M    0% /dev/shm
tmpfs                    920M  8.8M  911M    1% /run
tmpfs                    920M     0  920M    0% /sys/fs/cgroup
/dev/sda1               1014M  142M  873M   14% /boot
tmpfs                    184M     0  184M    0% /run/user/0

4、在程式指令碼中使用多個命令

[root@node1 ~]# echo 'this is sam' | gawk '{$4="lisi";print $0}'  
this is sam lisi

5、從檔案中讀取程式

gawk編輯器允許將程式儲存到檔案中,然後在命令列中引用。

[root@node1 ljy]# more script.gawk 
{print $1 "'s home directory is " $6}
[root@node1 ljy]# gawk -F: -f script.gawk /etc/passwd
root's home directory is /root
bin's home directory is /bin
daemon's home directory is /sbin
adm's home directory is /var/adm
lp's home directory is /var/spool/lpd
sync's home directory is /sbin
shutdown's home directory is /sbin
halt's home directory is /sbin
mail's home directory is /var/spool/mail
operator's home directory is /root
games's home directory is /usr/games
ftp's home directory is /var/ftp
nobody's home directory is /
systemd-network's home directory is /
dbus's home directory is /
polkitd's home directory is /
sshd's home directory is /var/empty/sshd
postfix's home directory is /var/spool/postfix
chrony's home directory is /var/lib/chrony
mysql's home directory is /var/lib/mysql
dockerroot's home directory is /var/lib/docker
ljy's home directory is /home/ljy