linux中shell的awk和sed簡介
1.sed命令
sed:stream editor :一次處理一行內容,處理時,把當前的行儲存在臨時緩衝區,處理完後,輸送到螢幕
sed [引數] '命令' file
p ##顯示
d ##刪除
a ##新增
c ##替換
i ##插入
1)p:
sed -n '/\:/p' /etc/fstab ##顯示有:的行 sed -n '/^#/p' /etc/fstab ##顯示#開頭的行 sed -n '/^#/!p' /etc/fstab ##顯示不以#開頭的行 sed -n '2,6p' /etc/fstab ##顯示第2-6行 sed -n '2,6!p' /etc/fstab ##顯示2到6行以外的行
2)d:
sed '/^UUID/d' /etc/fstab ##刪除UUID開頭的
sed '/^#/d' /etc/fstab ##刪除空行
sed '/^$/d' /etc/fstab ##刪除以$開頭的
sed '1,4d' /etc/fstab ##刪除1到4行
3)a:
sed '/hello/aworld' westos ##在westos裡的hello後新增world sed 's/hello/hello world/g' westos ##實際效果是在hello後添加了world sed 's/hello/hello\nworld/g' westos ##實際效果是hello後面換行後添加了world
4)c:替換
sed '/hello/chello world' westos ##將hello替換成hello world
5)i:
sed '/hello/iworld\nwestos' westos ##hello之前插入world 換行 westos
6)-i:改變原檔案內容
sed -i 's/westos/redhat/' passwd ##每一行的第一個替換
sed -i 's/westos/redhat/g' passwd ##全域性替換
2.awk報告生成器
this | is | a | file ##如下,awk把變數分為了四列
$1 $2 $3 $4
awk '{print $0}' test ##$0表示輸出一整行
awk '{print $1}' test ##輸出第一個變數
awk '{print $4}' test ##輸出第四個變數
awk '{print $1,$2}' test ##顯示兩個欄位
awk -F ":" '{print $1,$3}' /etc/passwd ##指定:為分隔符,並輸出1,3列
1)awk的常用變數
awk '{print FILENAME,NR}' /etc/passwd ##輸出檔名,和當前操作的行號
awk -F: '{print NR,NF}' /etc/passwd ##輸出每次處理的行號,以及當前以":"為分隔符的欄位個數
總結:awk '{print "第NR行","有NF列"}' /etc/passwd
BEGIN{}:讀入第一行文字之前執行的語句,一般用來初始化操作
{}:逐行處理
END{}:處理完最後以行文字後執行,一般用來處理輸出結果awk 'BEGIN { a=34;print a+10 }'
awk -F: 'BEGIN{print "REDHAT"} {print NR;print } END {print "WESTOS"}' passwd ##檔案開頭加REDHAT,末尾加WESTOS,列印行號和內容
awk -F: '/bash$/{print}' /etc/passwd ##輸出以bash結尾的
awk -F: 'NR==3 {print}' /etc/passwd
awk -F: 'NR % 2 == 0 {print}' /etc/passwd ##偶數行
awk -F: 'NR >=3 && NR <=5 {print }' /etc/passwd
awk 'BEGIN{i=0}{i+=NF}END{print i}' linux.txt ##統計文字總欄位個數
2)if雙分支
awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd ##統計uid小於等於500和大於500的使用者個數
3)for迴圈
awk 'BEGIN{for(i=1;i<=5;i++){print i}}' ##輸出1.2.3.4.5
3.一些指令碼來加深印象
1)自動安裝http並修改埠
#!/bin/bash
yum install -y httpd &> /dev/null
sed -i "/^Listen/cListen $1" /etc/httpd/conf/httpd.conf
echo -e "Port has changed!"
echo "Now ,Port is $1!"
systemctl restart httpd
2)列出uid小於2的使用者資訊
#!/bin/bash
#練習:列出uid小於2的使用者資訊
awk -F: '$3 >= 0 && $3 < 2 {print $1,$3}' /etc/passwd