sed與awk的那些事兒!

sed與awk的那些事

  • 在這裏給大家簡單的介紹一下sed和awk的的基本常用選項
  • sed多數用於修改配置文件,並配合腳本使用,實現非交互方式自動部署各種服務。
  • awk有着很厲害的查詢功能,下面我們來看看awk的優勢吧!

Sed命令可以配合一下參數使用:
p顯示 d刪除 s替換 -n 屏蔽默認輸出 a 行後插入 i 行前插入 c 整行替換

. p是打印輸入的意思也就是print單詞的首字母:

sed -n ‘p’ /etc/passwd  #輸出/etc/passwd的全部配置
sed -n ‘1p’ /etc/passwd  #輸入第一行
sed -n ‘1,2p’ /etc/passwd  #輸出第一行到第二行
sed -n ‘/^root/p’ /etc/passwd #輸出以root開頭的行
sed -n ‘1p;4p’ /etc/passwd  #輸出第一行和第四行
sed -n ‘/bash$/p’ /etc/passwd  #輸出以bash結尾的行

. 首先我們來看下/etc/passwd這個文件的內容

[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

執行sed ‘1d’ /etc/passwd #刪除/etc/passwd文件中的第一行

[root@localhost ~]#sed ‘1d’ /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

這裏我們可以看到確實第一行被我們刪除了,讓我們再來看一下配置文件

[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

有很多人會疑問爲什麼刪除了,配置文件裏還有呢?
因爲我們執行命令的時候沒有加上-i選項,建議初學者慎用-i選項
如果加上-i選項那麼配置文件裏符合條件的內容就會被刪除掉。

即:sed -i ‘1d’ /etc/passwd

d是刪除也就是delete單詞的首字母:

sed ‘1d’ /etc/passwd  #刪除/etc/passwd文件中的第一行
sed ‘1,2d’ /etc/passwd  #刪除第一行到第二行
sed ‘/^root/d’ /etc/passwd  #刪除以root開頭的行
sed ‘1d;4d’ /etc/passwd  #刪除第一行和第四行
sed ‘/bash$/d’ /etc/passwd  #刪除以bash結尾的行

三. s是替換也就是substitute(代替)單詞的首字母:
格式 ‘s/要被替換的內容/替換成什麼/’ 文件路徑

ed -n ‘63,78s/#//’ a.txt	沒加-p不輸出
sed -n ‘s/aa/bb/2’ a.txt	將每行的第二個aa換成bb
sed -n ‘s/root/xwh/p’ a.txt	p是輸出出來
sed -n ‘s#/bin/bash#/bin/nologin#’ a.txt	用#當分隔符
sed -n ‘65,78s/^/#/’	開頭加上註釋
sed -n 'sed ‘2s/a/p/2p’ a.txt	替換第二行的第二個a字符爲p,後面的p是輸出

sed工具的多行文本處理操作:
i: 在指定的行之前插入文本
a:在指定的行之後追加文本
c:整行替換

[root@kube-node1 ~]# vimt a.txt  創建一個測試文件隨意寫點東西
servername 192.168.4.1
test sed -i -a -c

例子1:

[root@kube-node1 ~]# sed -i '2i hello world! ’ a.txt    在第2行前插入指定內容
[root@kube-node1 ~]# cat a.txt
servername 192.168.4.1
hello world!   這行就是我們用i添加進來的
test sed -i -a -c

例子2:

[root@kube-node1 ~]# sed -i '2a this is a test ’ a.txt    第2行後前插入指定內容
[root@kube-node1 ~]# cat a.txt
servername 192.168.4.1
hello world!   
this is a test      這行就是我們用a添加進來的
test sed -i -a -c

例子3:

[root@kube-node1 ~]# sed -i '3c test test test ’ a.txt    將第3行替換爲指定內容
[root@kube-node1 ~]# cat a.txt
servername 192.168.4.1
hello world!   
test test test     
test sed -i -a -c

awk基本使用
NR 指定行 NF指定列 -F 指定分隔符
格式:awk [選項] ‘[條件]{指令}’ 文件

awk{ print $1 $2}’ /root/a.txt	//輸出文件第一列和第二列的值 逐行任務
df -h | awk ‘NR==2{print $4}’	//輸出第二行第4列的值
awk -F: ‘{print $1,$7}’ /etc/passwd	//以冒號爲分隔符
awk -F: ‘{print NR,NF}’ /etc/passwd //輸出該文件有多少行,每行有多少列 中間用逗號相隔。逗號是空格,可以加可不加
awk -F: ‘{print $1,“家目錄是” $7}’ /etc/passwd	//awk可以輸出常量,需要用引號引起來
RX是接受數據量	TX是回覆的數據量
ifconfig eth0 | awk ‘/RX p/{print $5}’ //利用正則匹配,過濾包含RX p的行

利用3種方法獲得剩餘根分區可用的空間

[root@localhost ~]# df -h /
文件系統        容量  已用  可用 已用% 掛載點
/dev/sda1       385G   66G  300G   18% /

方法一:df -h / | tail -1 | awk ‘{print $4}’
方法二: df -h / | awk ‘NR==2{print $4}’
方法三:df -h | awk ‘$3 == “66G”{print $4}’

awk會逐行處理文本,支持在處理第一行之前做一些準備工作(比如先定義一個變量),以及在處理完最後一行之後做一些總結性質的工作(最後喊出變量)
格式:
awk [選項] ‘[條件]{指令}’ 文件
awk [選項] ’ BEGIN{指令} {指令} END{指令}’ 文件
BEGIN行前操作執行一次 awk ‘BEGIN{a=1;print a}’ 中間要用分號間隔,固定格式
{ } 逐行執行,END 行後處理只執行一次
示例:

首先利用BEGIN定義變量a,並過濾以bash結尾的行,有一行a的數就加1,最後輸出變量a
[root@localhost ~]#awk 'BEGIN{a=0}/bash$/{a++}END{print a}' /etc/passwd
6

統計全文行數:
[root@localhost ~]# awk 'BEGIN{x=1}{x++}END{print x} ' /etc/passwd
49

輸出第3列大於10並且小於20的用戶:
[root@localhost ~]# awk -F: '$3>10 && $3<20{print}' /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

awk分支:

單分支 ‘{ if(條件){編輯指令}}’
雙分支 ‘{if (條件){編輯指令}}else{編輯指令}’
多分支 ‘{if (條件) {編輯指令}else if(條件2){編輯指令}}awk -F: '{if($3<=1000){i++}}END{print i} ’ /etc/passwd	
awk -F: ‘{if($3<1000){a++}else{b++}}END{print a,b}’ /etc/passwd	awk -F: ‘{if($7=="/bin/bash"){x++}else{y++}}END{print x,y}’ /etc/passwd
awk -F: ‘BEGIN{x=0;b=0}{if($3>30){x++}else if($3<50){b++}}END{print x,b}’ /etc/passwd

數組:
格式:
for(變量 in 數組名){print 變量,數組名[變量]}
awk ‘BEGIN{a1=100;a2=200;print a1,a2}’ 一個下標對應一個值
awk ‘BEGIN{a1=12;a2=13;for (i in a){print i, a[i]}}’
遍歷數組:
cat a.txt
abc 對應 a[abc]=1
xyz 對應 a[xyz]=1
xyz 對應 a[xyz]=2
abc 對應 a[abc]=2
opq 對應 a[opq]=1
abc 對應 a[abc]=3
{a[$1]++} //數組名可以任意,逐行任務收集數據
awk ‘{a[$1]++}END{for(i in a){print i,a[i]}}’ a.txt
循環的是下標

[root@kube-node1 ~]# cat a.txt //做一個素材使用以下是內容
abc 192.168.0.1
xyz 192.168.0.2
xyz 192.168.0.2
abc 192.168.0.1
opq 192.168.0.3
abc 192.168.0.1

輸出各個ip出現了幾次

格式 ‘{ }END{ for ( ) {print }}’
[root@kube-node1 ~]# awk ‘{ip[$2]++}END{for (i in ip){print i,ip[i]}}’ a.txt

舉例查出/var/log/httpd/acces_log中哪個ip訪問了幾次?

[root@svr5 ~]# awk ‘{ip[$1]++}{for(i in ip)}{print i ,ip[i]}’ /var/log/httpd/acces_log | grep sort -nr	
-n 是正序 -r 是倒敘

下面我們用AWK寫一個腳本來獲取服務器硬件信息

[root@svr5 ~]# vim test.sh
#!/bin/bash
ip=ifconfig eth0 | awk '/inet /{print $2}'
echo “本地IP地址是:”$ip
cpu=uptime | awk '{print $NF}'
echo "本機CPU最近15分鐘的負載是:"$cpu
net_in=ifconfig eth0 | awk '/RX p/{print $5}'
echo “入站網卡流量爲:”$net_in
net_out=ifconfig eth0 | awk '/TX p/{print $5}'
echo “出站網卡流量爲:”$net_out
mem=free | awk '/Mem/{print $4}'
echo “內存剩餘容量爲:$mem
disk=`df | awk '/\/$/{print $4}'`
echo "根分區剩餘容量爲:"$disk
user=`cat /etc/passwd |wc -l`
echo "本地賬戶數量爲:"$user
login=`who | wc -l`
echo "當前登陸計算機的賬戶數量爲:"$login
process=`ps aux | wc -l`
echo "當前計算機啓動的進程數量爲:"$process
soft=`rpm -qa | wc -l`
echo "當前計算機已安裝的軟件數量爲:"$soft

最後讓我們一起來運行這個腳本吧!

[root@localhost ~]# bash test.sh
本地IP地址是:192.168.71.128
本機CPU最近15分鐘的負載是:0.05
入站網卡流量爲:2179218
出站網卡流量爲:110655
內存剩餘容量爲:11239072
根分區剩餘容量爲:314253608
本地賬戶數量爲:48
當前登陸計算機的賬戶數量爲:3
當前計算機啓動的進程數量爲:228
當前計算機已安裝的軟件數量爲:1578
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章