目錄
- Linux三劍客及使用介紹
-
- 一、正規表達式
- 二、grep的介紹
- 三、awk介紹
- 四、sed 介紹
- 習題
Linux三劍客及使用介紹
Linux 三劍客是(grep,sed,awk)三者的簡稱,他們通常結合正則一起使用。
grep擅長查找,sed擅長修改檔案。awk擅長取列。
一、正規表達式
正規表達式:REGular EXPression, REGEXP
元字元:所謂元字元就是指那些在正規表達式中具有特殊意義的專用字元
元字元 | 功能 |
---|---|
. | 比對任意單個字元 |
* | X* 比對0或多個X字元 |
+ | X+ 比對至少1個X字元 |
.* | 比對任意多個字元 |
^ | 比對首行 |
$ | 比對行尾 |
^$ | 空行 |
\ | 屏蔽一個元字元的特殊含義 |
\< | 錨定詞首,其後面的任意字元必須作為單詞首部出現 |
\> | 錨定詞尾,其前面的任意字元必須作為單詞的尾部出現 |
\b | 單詞界定符 |
test{n} | 比對前面為tes後面接n個t的字元串 |
test{n,m} | 比對前面為tes後面接n~m個t的字元串 |
test{n,} | 比對前面為tes後面有n個以上(包含n)的t的字元串 |
(test){n} | 将test做完整體比對有n個test相連的字元串 |
[abc] | 包含abc中任意一個字元 |
[^abc] | 不包含abc中的任意一個字元(取反) |
二、grep的介紹
grep 是一個文本過濾工具
egrp 支援擴充正則
options部分
- -v 顯示不被pattern比對到的行
- -o 僅顯示比對到的字元串
- -n 顯示比對的行号
- -i 忽略字元大小寫
- -A n 顯示後n行
- -B n 顯示前n行
- -C n 顯示上下n行
- -r 遞歸查找
案列:
[[email protected] ~]# grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
過濾出行首為root的行:
[[email protected] ~]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
1、查找出目前passwd檔案中以ftp或者mail開頭的行,在螢幕上輸出。
cat passwd|egrep "^ftp|^mail"|xargs echo
2、查找出來/etc/passwd檔案裡使用者名包含liu同時使用bash的使用者
awk -F: '$1 ~ /liu/&& $7 ~ /bash/ {print $0}' passwd
3、查找出不包含數字的行
grep -v "[0-9]"
4、查找出/var/log/secure裡的ip位址出來
255.255.255.255
egrep "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" /var/log/secure
5、寫一個表示下面網址的正規表達式出來。例如:
http://www.baidu.com
http://www.sina.com
http://www.163.com
http://www.12306.cn
http://www.qillu.edu
egrep "http://([a-zA-Z0-9]+.)+[a-zA-Z]+"
egrep "https?://([a-zA-Z0-9]+.)+[a-zA-Z]+"
三、awk介紹
AWK 是一種處理文本檔案的語言,是一個強大的文本分析工具。
awk
輸入分隔符
-F 預設空白
輸出分隔符
, 預設空格
-F : :指定分隔符
FS :輸入分隔符
OFS :輸出分隔符
$0 :整行
NR :行号 number of record
NF :一行的字段數量 number of field
cat /etc/passwd|tail -1|awk -F[:/] '{print $8}'
cat /etc/passwd |awk -F : 'BEGIN{num=0;print "開始統計 /etc/passwd檔案"} $1 ~/root/ ||$3 > 1005 {print NR,NF,$1,length($1),$(NF-1),$NF,$3,++num}END{print "統計結束",num}'
awk和shell變量交換的問題
- 使用 -v選項
name=root
cat passwd |awk -F: -v name=$name '$1~name{print $0}'
- 使用雙引号 ,但是awk内部的$0 1 等 1 等 1等符号前需要使用\轉義
name=root
cat passwd| awk -F: “/^$name/{print $1, $3}”
- 使用單引号,将變量引起來,然後前面加一個$符号再次引用變量的值,相當于取2次值
sg=3
awk -F : '/root/{print $1,$'$sg'}' /etc/passwd
awk内置的函數:
- length()
- int()
- sqrt()
- system()
String Functions
- sub()
- index()
- length()
- split()
三元運算
先使用ifconfig,使用awk顯示eth0的入站流量和出站流量(位元組)
練習

cat passwd |awk -F: '{print $(NF-1)}'
cat passwd |awk -F: 'NR >=5 && NR <=10{print $1}'
cat passwd |awk -F: '$7!~/bash/ {print $1}'
cat passwd |awk -F: 'NR~/5$/{print NR,$0}'
ifconfig|awk '$1=="inet"{print $2}'
ifconfig |grep -A 7 "eth0"| awk '$4=="bytes"{print $1 == "RX"? "入站流量:": "出站流量:";print $5}'
cat passwd |awk -F: 'BEGIN{sum=0; print "查詢結果"}$1 ~ /^r/{print $1;sum++ }END{print sum}'
四、sed 介紹
是一種支援正規表達式的非互動式流編輯器
sed 可依照腳本的指令來處理、編輯文本檔案。
Sed 主要用來自動編輯一個或多個檔案、簡化對檔案的反複操作、編寫轉換程式等。
sed的常用選項
- -n: 隻顯示比對處理的行(否則輸出所有)
- -i: 直接在檔案中進行修改,而不是輸出到螢幕
- -r: 支援擴充正規表達式
- -e: 執行多個編輯指令時(一般用 ; 代替)
sed動作說明:
- s :替換 通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g
- p :列印比對行。通常 p 會與參數 sed -n 一起運作~
- d :删除指定行
- i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行)
- a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
- c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
p指令輸出的時候
- 1,5p 連續
- 1p;5p 不連續
- cat passwd -n |sed -n ‘5,+3p’ 後三行
- cat passwd -n |sed -n ‘5,100!p’ 取反
- cat passwd -n |sed -n ‘1~2p’ 從第一行開始,步長為2
sed 的空間模式
- pattern space --》處理資料的地方–》處理一行資料後,模式空間會清空
- hold space --》臨時存放資料的地方
題目:查找nginx日志的access.log日志檔案 09/Jan/2021:16:37:12 到 09/Jan/2021:16:51:45
access.log中09/Jan/2021:16:37:12 和 09/Jan/2021:16:51:45 必須存在