linux 三劍客


三劍客

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 讀取文件之前執行
  • 進行統計、計算、不涉及讀取文件(常見)
  • 用來處理文件之前,添加個表頭
  • 用定義 awk 變量(很少用,因為可以使用 -v)
END{} 里面的內容會在 awk 讀取文件之后執行
  • 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM