天天看點

Linux三劍客(grep、awk、sed)Linux三劍客及使用介紹

目錄

  • 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變量交換的問題

  1. 使用 -v選項
name=root
	cat passwd |awk -F: -v name=$name '$1~name{print $0}'
           
  1. 使用雙引号 ,但是awk内部的$0 1 等 1 等 1等符号前需要使用\轉義

name=root

cat passwd| awk -F: “/^$name/{print $1, $3}”

  1. 使用單引号,将變量引起來,然後前面加一個$符号再次引用變量的值,相當于取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的入站流量和出站流量(位元組)

練習

Linux三劍客(grep、awk、sed)Linux三劍客及使用介紹
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 必須存在

習題

繼續閱讀