shell高階-----初識sed和gawk
阿新 • • 發佈:2019-05-24
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