一、行文本處理awk命令
原理:逐行處理文本中的數(shù)據(jù)
格式:awk -F “自定義分割符號(hào)” '{print $Nu}'
語(yǔ)法:awk 'pattern + {action}'
- 單引號(hào)''是為了和shell命令區(qū)分開(kāi)
- 大括號(hào){}表示一個(gè)命令分組
- pattern是一個(gè)過(guò)濾器,表示符合pattern條件的行才進(jìn)行action處理
- action是處理動(dòng)作
- 使用#作為注釋
- pattern和action可以只有其一,但不能兩者都沒(méi)有
- 默認(rèn)的action是print
- 默認(rèn)是以空白為分割符號(hào),空格之間內(nèi)容算一列
- F參數(shù)可以指定分割符
- print參數(shù)后面可以用雙引號(hào)""添加多種需要打印的內(nèi)容,而且可以同時(shí)打印多列參數(shù)
awk內(nèi)置變量
FS 分隔符,默認(rèn)是空格
NR 當(dāng)前行數(shù),從1開(kāi)始
NF 當(dāng)前記錄字段個(gè)數(shù)
1~$n 當(dāng)前記錄第n個(gè)字段
內(nèi)置函數(shù)
gsub(r,s):在$0中用s代替r
index(s,t):返回s中t的第一個(gè)位置
length(s):s的長(zhǎng)度
match(s,r):s是否匹配r
split(s,a,fs):在fs上將s分成序列a
substr(s,p):返回s從p開(kāi)始的子串
下面以/etc/passwd文件為例進(jìn)行一些操作嘗試
#默認(rèn)以空格分割,那整個(gè)文件就只有一列,打印最后一列結(jié)果如下
[root@localhost ~]# cat /etc/passwd|awk '{print $1}'|tail -1
tcpdump:x:72:72::/:/sbin/nologin
#用冒號(hào)分割打印第一列用戶名
[root@localhost ~]# cat /etc/passwd|awk -F: '{print $1}'|tail -1
tcpdump
#從ifconfig結(jié)果中匹配出Ip地址,思路:先grep匹配所在行,再用awk列切割
#匹配行
[root@localhost ~]# ifconfig|grep "Bcast"
inet addr:192.168.15.172 Bcast:192.168.15.255 Mask:255.255.255.0
#切割列同時(shí)將多余字符替換為空
[root@localhost ~]# ifconfig|grep "Bcast"|awk '{print $2}'|sed 's/addr://g'
192.168.15.172
#也可以進(jìn)行2次awk切割
[root@localhost ~]# ifconfig|grep "Bcast"|awk '{print $2}'|awk -F: '{print $2}'
192.168.15.172
[root@localhost ~]# ifconfig|grep "Bcast"|awk '{print $2}'|awk -F: '{print "ip:"$2"-"$1}'
ip:192.168.15.172-addr
#打印文件的第1,3行用分號(hào)間隔條件
[root@localhost sh]# cat test.txt|awk 'NR==1;NR==3 {print $0}'
www.jf.com aaa
www.jf.com ccc
#打印第3行以后內(nèi)容
[root@localhost sh]# cat test.txt|awk 'NR>=3 {print $0}'
www.jf.com ccc
www.jf.com ddd
www.jf.com eee
#打印符號(hào)條件最后一個(gè)域(默認(rèn)空格分割的最后一列)
[root@localhost sh]# cat test.txt|awk '{print $NF}'
aaa
bbb
ccc
#打印倒數(shù)第2個(gè)域
[root@localhost sh]# cat test.txt|awk '{print $(NF-1)}'
www.jf.com
www.jf.com
#查看tcp監(jiān)聽(tīng)端口的狀態(tài)
[root@localhost sh]# netstat -an|awk '/^tcp/ {print $NF}'
LISTEN
LISTEN #監(jiān)聽(tīng)
ESTABLISHED #轉(zhuǎn)發(fā)
#掃描文件打印所有字符長(zhǎng)度大于80的行的行號(hào)NR
[root@localhost sh]# cat test.txt|awk 'length($0)>80 {print NR}'
二、對(duì)象查找命令find
格式: find 查找范圍(某個(gè)目錄) -name "file_name"
如果用/根目錄就是全盤掃描,比較慢
- name 參數(shù)指定文件名可以搭配通配符,
! -name "filename"表示不包含某個(gè)文件 - type 參數(shù)可以限定查找對(duì)象范圍,如
-type f就是查找文件,d就是查找目錄 - exec 是擴(kuò)展參數(shù)和其他命令搭配使用
- size 參數(shù)指定對(duì)象大小如
+1M,表示大于1M - mtime 參數(shù)表示修改時(shí)間,默認(rèn)單位天
- mtime +30表示30天前,- mtime -30表示30天內(nèi) - perm 參數(shù)表示查找權(quán)限如
-perm 644 - maxdepth 參數(shù)決定查找目錄的深度
-maxdepth 1表示只找目標(biāo)的下一級(jí)目錄
#在/data目錄下查找所有以.sh結(jié)尾的文件
[root@localhost ~]# find /data/ -name "*.sh"
/data/sh/ssh_ip.sh
/data/sh/while_scp_dir
利用for循環(huán)拷貝查找對(duì)象到指定目錄
[root@localhost ~]# for i in `find /data/ -name "*.sh"`;do cp $i /root/ ;done
#刪除查找對(duì)象,{}表示前面超找對(duì)象 \;是find命令固定用法表示結(jié)束無(wú)其他意義
[root@localhost ~]# find /data/ -name "*.sh"|xargs rm -rf {} \;
#拷貝對(duì)象
[root@localhost ~]# find /data/ -name "*.sh" -exec cp {} /tmp/ \;
#移走對(duì)象
[root@localhost ~]# find /data/ -name "*.sh" -exec mv {} /tmp/ \;
三、文本編輯處理替換命令sed
格式:sed -i '1,3s/old/new/g' filename
替換部分的字段必須加單引號(hào)'',單引號(hào)內(nèi)第一個(gè)參數(shù)s表示替換,不加參數(shù)留空表示查找,末尾參數(shù)g表示全局掃描,不帶g參數(shù)只會(huì)替換找到的第一個(gè)對(duì)象,1,3表示針對(duì)具體行
- i參數(shù)表示修改,不加i參數(shù)只能在屏幕上輸出預(yù)覽修改都的效果并不會(huì)修改源文件,加i參數(shù)就沒(méi)有輸出直接改源文件
- a參數(shù)表示在查找對(duì)象下一行添加內(nèi)容,不帶空格a后面直接跟添加內(nèi)容
- i 單引號(hào)內(nèi)i參數(shù)表示在上一行插入
#n/p參數(shù)搭配使用查找特定對(duì)象
[root@localhost ~]# df -h|sed -n '/sda1/p'
/dev/sda1 194M 30M 155M 17% /boot
#預(yù)覽添加內(nèi)容如給腳本加個(gè)注釋語(yǔ)句,注意a后面直接跟內(nèi)容
[root@localhost sh]# sed '/192.168.15.2/a#this is test' ip_list
192.168.15.1 /var/www/html1 /data/www/html1
192.168.15.2 /var/www/html2 /data/www/html2
#this is test
#上一行插入
[root@localhost sh]# sed '/192.168.15.2/i#this is test2' ip_list
192.168.15.1 /var/www/html1 /data/www/html1
#this is test2
192.168.15.2 /var/www/html2 /data/www/html2
#結(jié)合命令打印1到3行,用逗號(hào)間隔
[root@localhost ~]# df -h|sed -n '1,3p'
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 77G 3.5G 70G 5% /
tmpfs 491M 0 491M 0% /dev/shm
#結(jié)合命令打印1和3行,用分號(hào)間隔
[root@localhost ~]# df -h|sed -n '1p;3p'
Filesystem Size Used Avail Use% Mounted on
tmpfs 491M 0 491M 0% /dev/shm
#查找以/結(jié)尾的行打印出來(lái)
[root@localhost ~]# df -h|sed -n '/\/$/p'
/dev/sda2 77G 3.5G 70G 5% /
#多個(gè)替換可以一起書寫如將%及G替換為空,替換字段用分號(hào)間隔
[root@localhost ~]# df -h|sed -n '/\/$/p'|sed 's/G//g;s/%//g'
/dev/sda2 77 3.5 70 5 /
[root@localhost ~]# df -h|sed -n '/\/$/p'|sed -e 's/G//g' -e's/%//g'
/dev/sda2 77 3.5 70 5 /
#在每行的末尾或者開(kāi)頭追加字段,&表示追加,注意追加字段的空格處理
[root@localhost sh]# sed 's/^/&www.jf.com /g' test.txt
www.jf.com aaa
www.jf.com bbb
www.jf.com ccc
[root@localhost sh]# sed 's/$/& www.jf.com/g' test.txt
aaa www.jf.com
bbb www.jf.com
ccc www.jf.com
示例
#預(yù)覽替換后全部文件
sed 's/This/aaa/' test.txt
#-n選項(xiàng)和p命令一起使用表示只打印那些發(fā)生替換的行
sed -n 's/This/aaa/p' test.txt
#直接編輯文件選項(xiàng)-i,會(huì)匹配test.txt文件中每一行的第一個(gè)This替換為this
sed -i 's/This/this/' test.txt
#全面替換標(biāo)記g,使用后綴/g標(biāo)記會(huì)替換每一行中的所有匹配
sed 's/this/This/g' test.txt
#當(dāng)需要從第N處匹配開(kāi)始替換時(shí),可以使用/Ng
echo sksksksksksk | sed 's/sk/SK/2g'
skSKSKSKSKSK
echo sksksksksksk | sed 's/sk/SK/4g'
skskskSKSKSK
#以上命令中字符 / 在sed中作為定界符使用,也可以使用任意的定界符
echo sksksksksksk | sed 's:sk:SK:4g'
echo sksksksksksk | sed 's|sk|SK|4g'
#定界符出現(xiàn)在樣式內(nèi)部時(shí),需要進(jìn)行轉(zhuǎn)義
echo '/usr/local/bin' | sed 's/\/usr\/local\/bin/\/USR\/LOCAL\/BIN/g'
/USR/LOCAL/BIN
#刪除空白行d
sed '/^$/d' test.txt
#刪除文件指定第2行(編輯文件需要和參數(shù)i配合使用)
sed '2d' test.txt
#刪除文件的第2行到末尾所有行
sed '2,$d' test.txt
#刪除文件最后一行
sed '$d' test.txt
#刪除文件中所有以my開(kāi)頭的行
sed '/^my/'d test.txt
#打印從第5行開(kāi)始到第一個(gè)包含以this開(kāi)始的行之間的所有行
sed -n '5,/^this/p' test.txt
#-e選項(xiàng)允許在同一行里執(zhí)行多條命令,第一條命令刪除1至5行,第二條命令用MY替換my。命令的執(zhí)行順序?qū)Y(jié)果有影響。如果兩個(gè)命令都是替換命令,那么第一個(gè)命令將影響第二個(gè)命令的結(jié)果
sed -e '1,5d' -e 's/my/MY/' test.txt
#寫入命令w,在test.txt中所有包含my的行都被寫入test2.txt里
sed -n '/my/w test2.txt' test.txt