三劍客
grep、sed 和 awk 命令,俗稱 linux 界里的三劍客。
三劍客特點及應用場景
命令 | 特點 | 場景 |
grep | 過濾 | grep是過濾最快的 |
sed | 替換、修改文件內容、取航 | 對文件內容進行替換,取出某個范圍的內容(早上10到11點) |
awk | 取列、統計計算 | 取列、對比、比較、統計計算 |
grep 命令
正則表達式 - 花花de代碼生活 - 博客園 (cnblogs.com) 這個就充分說明了 grep 命令參數及使用。
sed命令
sed 特點及格式
- sed stream editor 簡稱 sed:流編輯器,sed把處理的內容(文件),當做流水,源源不斷的進行處理,直到文件尾部
- sed 格式
命令 | 選項 | (s)sed 命令功能替換 (g)修飾符也可以不寫 | 參數(文件) |
sed | -r | 's#olkdboy#oldgir#g' | oldboyd.txt |
- sed 命令核心功能(增刪改查)
s | 替換 substitute sud |
p | 顯示 print |
d | 刪除 delete |
cai | 增加 c/a/i |
sed 執行格式
- "找誰干啥"
- 找誰:"你要哪一行"
- 干啥:"增刪改查"
sed 核心應用
sed 查找 p
1 '2p' 指定查找行號進行查找 ==> sed -n '2p' sed_text.txt //只查找第 2 行數據 2 '1,5p' 指定范圍進行查找 ==> sed -n '1,5p' sed_text.txt //查找 1 到 5 行 3 '$p' 顯示最后一行 ==> sed -n '4,$p' sed_text.txt //查找第四行到最后一行 4 '/lidao/p' 類似於 grep 過濾查找,//里可以寫正則 ==> sed -n '/11:26:30/,/11:30:00/p' sed_text.txt //查找log 11:26到11:30
sed 刪除 d
1 '2d' 指定刪除第2行數據 2 '1,5d' 范圍刪除第1行到第5行數據 3 '$d' 刪除最后一行 4 '/lidao/d' 查找刪除 lidao 這個單詞
案例
刪除文件中的空行包含井號的行
grep -v '^$|#' /etc/ssh/sshd_config
sed -r '/^$|#/d' /etc/ssh/sshd_config
# ! 的妙用
sed -nr '/^$|#/!p' /etc/ssh/sshd_config //不顯示空格和井號
sed 增加 cai
命令 | 含義 |
c | replace 代替這行內容 |
a | append 追加,向指定的行或每一行追加內容(行后面) |
i | insert 插入,向指定的行或每行插入內容(行前面) |
案例:向文件中追加多行內容
1 例子:向 config 里追加 2 UseDNS no 3 GSSAPIAUTCATION no 4 PeritRootLogin no 5
6 方法一: 7 cat >>config<< 'EOF' #單引號是里面有特殊符號時加的 8 UseDNS no 9 GSSAPIAUTCATION no 10 PeritRootLogin no 11 EOF 12
13 方法二: 14 sed '$a UseDNS no\GSSAPIAUTCATION no\PeritRootLogin no' config
sed 替換 s
- s ==> sub subsitute 替換
- 替換格式:s###g、s@@@g、s///g 都可以
- g ==> global 全局替換,sed替換每行所以匹配的內容,sed 默認只替換每一行第一個匹配的內容
案例:永久關閉 selinux
1 sed -i '/SELINUX/{s/enorcing/disabled/}' /etc/selinux/config
后向引用,反引用
口訣:先保護后使用
舉例:
[root@shell ~]# echo 123456
123456 #第一個()從開頭到2、中間()是全部、第三個()5開頭到最后。\2是取第二個獲取到的數據 [root@shell ~]# echo 123456 |sed -r 's#(^.*2)(.*)(5.*$)#<\2>#g'
<34> #獲取ip地址 [root@shell ~]# ip a s ens33 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:89:d1:fc brd ff:ff:ff:ff:ff:ff inet 192.168.100.250/24 brd 192.168.100.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::4629:e885:ac9c:7d76/64 scope link noprefixroute valid_lft forever preferred_lft forever
# 方法一 [root@shell ~]# ip a s ens33 |sed -n '3p'|sed -r 's#(^.*t )(.*)(/.*$)#\2#g'
192.168.100.250 # 方法二
[root@shell ~]# ip a s ens33 |sed -rn '3s#(^.* )(.*)(/.*$)#\2#gp'
192.168.100.250
awk 命令
awk 應用場景
awk 是一門語言,類似於 c 語言,主要是過濾、統計、計算和統計日志。
行於列
名詞 | awk中的叫法 | 說明 |
行 | 記錄 record | 每一行默認通過回車分割的 |
列 | 字段、域 field | 每一列默認通過空格分割的 |
awk 中行和列結束標記都是可以修改的 |
取行
模式 | 說明 |
NR==1 | 取出某一行 |
NR>=1 && NR>=5 | 取出1到5行 |
/oldboy/ | 取出有 oldboy 的行 |
/101/,/105/ | 取出 101-105 行 |
符號 | > < >= <= == != |
例:
1 [root@shell ttt]# cat awk_t.txt 2 1. asjia 3 2. dafaf 4 3. fmopia 5 4. root 6 5. dfwfg 7 6. sfghhb 8 [root@shell ttt]# awk '/2/,/5/' awk_t.txt 9 2. dafaf 10 3. fmopia 11 4. root 12 5. dfwfg 13 [root@shell ttt]# awk 'NR==2' awk_t.txt 14 2. dafaf
取列
選項 | 說明 |
-F | 指定分隔符,指定每一列結束標記(默認是空格,連續的空格,tab鍵) |
$數字 | 取出某一列,注意:在 awk 中 $ 內容一個意思,表示取出某一列 |
$0 | 整行的內容 |
{ptint xxx} | 取列的時候使用的選項 |
$NF | 表示最后一列 |
例:
1 [root@shell ~]# ls -l 2 總用量 4
3 -rw-------. 1 root root 1311 3月 18 15:35 anaconda-ks.cfg 4 drwxr-xr-x 2 root root 55 3月 20 16:40 CTF 5 drwxr-xr-x 2 root root 247 4月 3 12:36 ttt 6 # 顯示第5列 7 [root@shell ~]# ls -l |awk '{print $5}'
8
9 1311
10 55
11 247
12 # 顯示第5列和第9列 (column -t 是對齊) 13 [root@shell ~]# ls -l |awk '{print $5,$9}' |column -t 14 1311 anaconda-ks.cfg 15 55 CTF 16 247 ttt 17 # 調換位置顯示 18 [root@shell ~]# ls -l |awk '{print $9,$5}' |column -t 19 anaconda-ks.cfg 1311
20 CTF 55
21 ttt 247
22
23 # 獲取ip地址 -F:以什么為分隔符 、+:空格可能有連續的所以使用+ 24 [root@shell ~]# ip a s ens33 |awk -F"[ /]+" 'NR==3{print $3}'
25 192.168.100.250
awk 正則
- // 支持正則
- awk可以精確到某行,某列中包括/不包括.....內容
- ~ 包含
- !~ 不包含
例:
1 # -F表示以:為分隔符、$3:第三列以1開頭的行 2 [root@shell ~]# awk -F: '$3~/^1/' /etc/passwd 3 bin:x:1:1:bin:/bin:/sbin/nologin 4 operator:x:11:0:operator:/root:/sbin/nologin 5 games:x:12:100:games:/usr/games:/sbin/nologin 6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 7 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 8 mysql:x:1000:1000::/home/mysql:/sbin/nologin 9
10 # 找出第三列以1或2開頭的行,並顯示第一行、第二行和最后一行 11 [root@shell ~]# awk -F: '$3~/^[1|2]/{print $1,$3,$NF}' /etc/passwd 12 bin 1 /sbin/nologin 13 operator 11 /sbin/nologin 14 games 12 /sbin/nologin 15 ftp 14 /sbin/nologin 16 systemd-network 192 /sbin/nologin 17 mysql 1000 /sbin/nologin
awk 正則范圍
- /哪里開始/,/哪里結束/
- NR==1,NR==5 從第一行開始第五行結束
1 # 找出11.20到11.30 的第一行日志 2 awk '/11:20:00/,/11:30:00/{print $1}' mysql.log
特殊模式 BEGIN{} 和 END{}
模式 | 含義 | 應用場景 |
BEGIN{} | 里面的內容會在 awk 讀取文件之前執行 |
|
END{} | 里面的內容會在 awk 讀取文件之后執行 |
|
BEGIN{}
awk 數組
awk 字母會識別為變量,如果只是想使用字符串需要使用雙引號引起來
[root@shell ~]# awk 'BEGIN{a[0]=123456;a[1]="huahua";print a[0] a[1]}' 123456huahua #不加 a[i] 就只顯示數組下標很數組號 [root@shell ~]# awk 'BEGIN{a[0]=123456;a[1]="huahua";a[2]="afjika";for(i in a) print i,a[i]}'
0 123456
1 huahua 2 afjika
END{}
統計方法:
- i=i+1:簡稱 i++ 應用場景統計,計數
- sum=sum+???: 簡稱 sum+=??? 應用場景求和,累加
- array[]=artray[]+:數組統計
[root@shell ~]# awk '/^$/' /etc//services |wc -l
17 [root@shell ~]# awk '/^$/{i++}END{print i}' /etc//services
17
例:1 加到 100
1 [root@shell ~]# seq 100 |awk '{sum=sum+$1}END{print sum}'
2 5050
數組統計(統計次數)
1 [root@shell ~]# cat url.txt 2 http: // www. etiantian. org/index.html
3 http: // www. etiantian. org/1.html
4 http: //post.etiantian. org/index.html
5 http: //mp3.etiantian. org/index.html
6 http: // www. etiantian.org/3.html
7 # sort -rnk2 是倒敘排列 8 [root@shell ~]# awk -F"[/.]+" '{array[$2]++}END{for(i in array)print i,array[i]}' url.txt |sort -rnk2 9 www 3
10 post 1
11 mp3 1