02-三劍客命令grep、sed、awk

1. grep命令

做用:做用是在文件中提取和匹配符合條件的字符串java

[root@localhost ~]# grep [選項] "搜索內容" 文件名python

-c 計算找到‘搜索字符串’的行數
-o 指輸出匹配的內容
-i 不區分大小寫
-n 顯示匹配內容的行號
-r 當指定要查找的是目錄而非文件時,必須使用這項參數,也就是遞在目錄中歸查找內容
-v 反向選擇,即沒有‘搜索字符串’內容的行
-E 擴展 grep,即 egrep,能夠使用擴展正則表達式
-l 列出文件內容符合指定的範本樣式的文件名稱
--color=auto 搜索關鍵詞顯示顏色
-V 顯示軟件版本信息

案例:linux

# 從tesh.sh中查找包含echo行的信息
[root@localhost ~]# grep "echo" test.sh
# 從tesh.sh中查找包含echo行的信息,只統計行數
[root@localhost ~]# grep -c "echo" test.sh
5

2. Shell常見通配符

用於匹配文件名,徹底匹配c++

通 配 符 做 用
? 匹配一個任意字符
* 匹配0個或任意多個任意字符,也就是能夠匹配任何內容
[] 匹配中括號中任意一個字符。例如,[abc]表明必定匹配一個字符,或者是a,或者是b,或者是c
[-] 匹配中括號中任意一個字符,-表明一個範圍。例如,[a-z]表明匹配一個小寫字母
[^] 邏輯非,表示匹配不是中括號內的一個字符。例如,[^0-9]表明匹配一個不是數字的字符

練習:正則表達式

[root@localhost ~]# touch abc abcd acc acd bcd bbbde 123a 234d b453 a_c  abccd
[root@localhost ~]# ls
123a  234d  abc  abcd  acc a_c acd  b453  bbbde  bcd   abccd

# 查找文件名爲abc的文件,精確查找
[root@localhost ~]# find ./ -type f -name "abc"
./abc

# 查找包含文件名爲abc的文件,模糊查找
[root@localhost ~]# find ./ -type f -name "abc*"
./abc
./abcd
./abccd

# 查找a和c的中間爲任意一個字符的文件
[root@localhost ~]# find ./ -type f -name "a?c"
./abc
./acc
./a_c

# 查找a和c中間只能是a b _其中任意一個字符的文件
[root@localhost ~]# find ./ -type f -name "a[bc_]c"
./abc
./acc
./a_c

# 查找a和c中間只能是小寫字母其中任意一個字符的文件
[root@localhost ~]# find ./ -type f -name "a[a-z]c"
./abc
./acc

# 查找cd前面是任意一個小寫字母的文件
[root@localhost ~]# find ./ -type f -name "[a-z]cd"
./acd
./bcd

# 查找a和c中間不包含字母的文件
[root@localhost ~]# find ./ -type f -name "a[^a-z]c"
./a_c

3. 基礎正則

用於匹配字符串,包含匹配shell

元字符 做 用
* 前一個字符匹配0次或任意屢次。
. 匹配除了換行符外任意一個字符
^ 匹配行首。例如:^hello會匹配以hello開頭的行。
$ 匹配行尾。例如:hello&會匹配以hello結尾的行
[] 匹配中括號中指定的任意一個字符,只匹配一個字符。例如:[aoeiu] 匹配任意一個元音字母,[0-9] 匹配任意一位數字, [a-z]、[0-9]匹配小寫字和一位數字構成的兩位字符。
[^] 匹配除中括號的字符之外的任意一個字符。例如:[^0-9] 匹配任意一位非數字字符,[^a-z] 表示任意一位非小寫字母。
\ 轉義符。用於取消講特殊符號的含義取消
{n} 表示其前面的字符剛好出現n次。例如:[0-9]{4} 匹配4位數字,[1][3-8][0-9]{9} 匹配手機號碼。
{n,} 表示其前面的字符出現不小於n次。例如: [0-9]{2,} 表示兩位及以上的數字
{n,m} 表示其前面的字符至少出現n次,最多出現m次。例如: [a-z]{6,8} 匹配6到8位的小寫字母。

4. sed命令

字符流編輯工具(行編輯工具)==按照每行中的字符進行處理操做編程

命令格式: sed [選項] ‘[動做]’ 文件名c#

命令做用:數組

  1. 擅長對行進行操做處理
  2. 擅長將文件的內容信息進行修改調整/刪除

具體功能做用:bash

  1. 文件中添加信息的能力 (增)
  2. 文件中刪除信息的能力 (刪)
  3. 文件中修改信息的能力 (改)
  4. 文件中查詢信息的能力 (查)

選項:

選項參數 做用
-n sed命令會把全部數據都輸出到屏幕,若是加入此選擇,則只會把通過sed命令處理的行輸出到屏幕
-e 容許對輸入數據應用多條sed命令編輯
-r 在sed中支持擴展正則表達式
-i 用sed的修改結果直接修改讀取數據的文件,而不是由屏幕輸出,寫入磁盤

動做:

p print 輸出指定的行
i insert 插入信息,在指定信息前面插入新的信息
a append 附加信息,在指定信息後面附加新的信息
d delete 刪除指定信息
s substitute 替換信息 s#舊信息#新信息#g(全局替換)
c 行替換,用c後面的字符串替換原數據行,替換多行時,除最後一行外,每行末尾需用「\」表明數據未完結。

sed命令 練習:

# 準備練習內容
[root@zabbix linux_study]#  cat  a.txt
name    age  gender  qq
pyhton  23   F       12324214214
linux   44   M       44454667
java    99   F       98989898
C       89   F       889877666
c++     78   M       8797665599

### 根據文件內容的行號進行查詢
# 顯示指定行號信息
[root@zabbix linux_study]# sed -n "1p" a.txt 
name    age  gender  qq

# 根據行號信息,輸出多行內容(連續)
[root@zabbix linux_study]# sed -n "1,3p" a.txt 
name    age  gender  qq
pyhton  23   F       12324214214
linux   44   M       44454667

# 根據行號信息,輸出多行內容(不連續)
[root@zabbix linux_study]# sed -n "1p;4p" a.txt 
name    age  gender  qq
java    99   F       98989898

### 根據文件內容的信息進行查詢:
# 根據內容信息,輸出單行內容
[root@zabbix linux_study]# sed -n "/linux/p" a.txt 
linux   44   M       44454667

# 根據內容信息,輸出多行內容(連續)
[root@zabbix linux_study]# sed -n "/python/,/java/p" a.txt 
python  23   F       12324214214
linux   44   M       44454667
java    99   F       98989898

# 根據內容信息,輸出多行內容(不連續)
[root@zabbix linux_study]# sed -n "/python/p;/java/p" a.txt 
python  23   F       12324214214
java    99   F       98989898

### sed添加信息 若是要真實修改文件內容,加上-i參數,-i和-n參不能同時使用 
# 在第二行添加[root@zabbix linux_study]# sed -r "2ic#\t99\t989988" a.txt 
name    age  gender  qq
c#	99	989988
python  23   F       12324214214
linux   44   M       44454667
java    99   F       98989898
C       89   F       889877666
c++     78   M       8797665599

# 在最後一行添加
[root@zabbix linux_study]# sed -r "\$ac#\t99\tF\t989988" a.txt 
name    age  gender  qq
python  23   F       12324214214
linux   44   M       44454667
java    99   F       98989898
C       89   F       889877666
c++     78   M       8797665599
c#	99	F	989988

# 在第二行後面添加
[root@zabbix linux_study]# sed -r "2ac#\t99\tF\t989988" a.txt 
name    age  gender  qq
python  23   F       12324214214
c#	99	F	989988
linux   44   M       44454667
java    99   F       98989898
C       89   F       889877666
c++     78   M       8797665599

### sed刪除信息  若是要真是刪除信息,加上-i參數
# 刪除指定行信息
[root@zabbix linux_study]# sed "2d" a.txt 
name    age  gender  qq
linux   44   M       44454667
java    99   F       98989898
C       89   F       889877666
c++     78   M       8797665599

# 刪除文件中第2行到第4行內容
[root@zabbix linux_study]# sed "2,4d" a.txt 
name    age  gender  qq
C       89   F       889877666
c++     78   M       8797665599

#刪除文件中第2行到第4行內容
[root@zabbix linux_study]# sed "2d;4d" a.txt 
name    age  gender  qq
linux   44   M       44454667
C       89   F       889877666
c++     78   M       8797665599

#刪除有linux行的信息
[root@zabbix linux_study]# sed "/linux/d" a.txt 
name    age  gender  qq
python  23   F       12324214214
java    99   F       98989898
C       89   F       889877666
c++     78   M       8797665599

### sed修改信息,把含有python的行的python改爲harris
[root@zabbix linux_study]# sed "s#python#harris#g" a.txt 
name    age  gender  qq
harris  23   F       12324214214
linux   44   M       44454667
java    99   F       98989898
C       89   F       889877666
c++     78   M       8797665599

5. awk編程

printf格式化輸出

[root@m01 ~]# printf '輸出類型輸出格式' 輸出內容 

輸出類型:  
    %ns:  輸出字符串。n 是數字指代輸出幾個字符  
    %ni:  輸出整數。n 是數字指代輸出幾個數字  
    %m.nf:輸出浮點數。m 和 n 是數字,指代輸出的整數位數和小數位數。				  			 如%8.2f     表明共輸出 8 位數,其中 2 位是小數,6 位是整數。 
輸出格式: 
    \n:   換行  
    \t:   水平輸出退格鍵,也就是 Tab 鍵  
    \a:   輸出警告聲音  
    \b:   輸出退格鍵,也就是 Backspace 鍵  
    \f:   清除屏幕  
    \r:   回車,也就是 Enter 鍵  
    \v:   垂直輸出退格鍵,也就是 Tab 鍵 

### 格式輸出
[root@m01 ~]# printf 'name\t age\t gender\n test\t 23\t 男\n'
name	age	gender
test	23	男

[root@m01 ~]# printf 'name\tage\tgender\taverage\n%s\t%2i\t%s\t%4.2f\n' test 22 F 22.12
name	age	gender	average
test	22	F	22.12

簡介:擅長對列進行操做和進行數據信息的統計,AWK是一種處理文本文件的語言,是一個強大的文本分析工具

命令做用:

1. 排除信息
2. 查詢信息
3. 統計信息
4. 替換信息

命令格式: awk [選項參數] '條件1{動做1} 條件2{動做2} 文件名

  • 選項參數說明:

    • -F fs or --field-separator fs
      指定輸入文件折分隔符,fs是一個字符串或者是一個正則表達式,如-F:。
    • -v var=value or --asign var=value
      賦值一個用戶定義變量。
    • -f scripfile or --file scriptfile
      從腳本文件中讀取awk命令。
    • -mf nnn and -mr nnn
      對nnn值設置內在限制,-mf選項限制分配給nnn的最大塊數目;-mr選項限制記錄的最大數目。這兩個功能是Bell實驗室版awk的擴展功能,在標準awk中不適用。
    • -W compact or --compat, -W traditional or --traditional
      在兼容模式下運行awk。因此gawk的行爲和標準的awk徹底同樣,全部的awk擴展都被忽略。
    • -W copyleft or --copyleft, -W copyright or --copyright
      打印簡短的版權信息。
    • -W help or --help, -W usage or --usage
      打印所有awk選項和每一個選項的簡短說明。
    • -W lint or --lint
      打印不能向傳統unix平臺移植的結構的警告。
    • -W lint-old or --lint-old
      打印關於不能向傳統unix平臺移植的結構的警告。
    • -W posix
      打開兼容模式。但有如下限制,不識別:/x、函數關鍵字、func、換碼序列以及當fs是一個空格時,將新行做爲一個域分隔符;操做符=不能代替^和^=;fflush無效。
    • -W re-interval or --re-inerval
      容許間隔正則表達式的使用,參考(grep中的Posix字符類),如括號表達式[[:alpha:]]。
    • -W source program-text or --source program-text
      使用program-text做爲源代碼,可與-f命令混用。
    • -W version or --version
      打印bug報告信息的版本。
  • 條件

    awk保留字 BEGIN 在 awk 程序一開始時,還沒有讀取任何數據以前執行
    END 在 awk 程序處理完全部數據,即將結束時執行
    關係運算符 > 大於
    < 小於
    >= 大於等於
    <= 小於等於
    == 等於。用於判斷兩個值是否相等,若是是給變量賦值,使用 「=」號
    != 不等於
    A~B 判斷字符串 A 中是否包含能匹配 B 表達式的子字符串
    A!~B 判斷字符串 A 中是否不包含能匹配 B 表達式的子字符串
    正則表達式 /正則/ 在「//」中能夠寫入字符,也能夠寫正則表達式
  • 動做

    • 格式化輸出
    • 流程控制語句

awk內置變量

$0 表明目前 awk 所讀入的整行數據。咱們已知 awk 是一行一行讀入數據 的,$0 就表明當前讀入行的整行數據
$n 表明目前讀入行的第 n 個字段。
NR 當前 awk 所處理的行,是總數據的第幾行
NF 當前行擁有的字段(列)總數, ($NF-n)表示倒數第n列
FS 用戶定義分隔符。awk 的默認分隔符是任何空格,若是想要使用其餘 分隔符(如「:」),就須要 FS 變量定義
ARGC 命令行參數個數
ARGV 命令行參數數組
FNR 當前文件中的當前記錄數(對輸入文件起始爲 1)
OFMT 數值的輸出格式(默認爲%.6g)
OFS 輸出字段的分隔符(默認爲空格)
RS 輸入記錄分隔符(默認爲換行符)
ORS 輸出記錄分隔符(默認爲換行符)

練習

## 練習環境準備
[root@m01 ~]# cat > test.txt << EOF
> 姓       名        ID          捐款記錄
> Zhang  Dandan    41117397    :250:100:175
> Zhang  Xiaoyu    390320151   :155:90:201
> Meng   Feixue    80042789    :250:60:50
> Wu     Waiwai    70271111    :250:80:75
> Liu    Bingbing  41117483    :250:100:175
> Wang   Xiaoai    3515064655  :50:95:135
> Zi     Gege      1986787350  :250:168:200
> Li     Youjiu    918391635   :175:75:300
> Lao    Nanhai    918391635   :250:100:175
> EOF

## 查詢信息
    逗號,表示連續的顯示一段行號開頭的信息
    分號;表示指定行號顯示
# NR:查詢指定第幾行信息 
[root@m01 ~]# awk 'NR==2' t1.txt 
Zhang  Xiaoyu    390320151   :155:90:201
# 查詢第2到第4行的信息
[root@m01 ~]# awk 'NR==2,NR==4' t1.txt 
Zhang  Xiaoyu    390320151   :155:90:201
Meng   Feixue    80042789    :250:60:50
Wu     Waiwai    70271111    :250:80:75
# 查詢第1行、第4行的信息
[root@m01 ~]# awk 'NR==1;NR==4' t1.txt 
Zhang  Dandan    41117397    :250:100:175
Wu     Waiwai    70271111    :250:80:75
# 使用//查詢
[root@m01 ~]# awk '/Zhang/' t1.txt 
Zhang  Dandan    41117397    :250:100:175
Zhang  Xiaoyu    390320151   :155:90:201
# 查詢Zhang、Lao所在的行信息
[root@m01 ~]# awk '/Zhang/;/Lao/' t1.txt 
Zhang  Dandan    41117397    :250:100:175
Zhang  Xiaoyu    390320151   :155:90:201
Lao    Nanhai    918391635   :250:100:175

# 顯示Zhang的ID號
[root@m01 ~]# awk '/Zhang/ {printf $3"\n"}' t1.txt 
41117397
390320151
# 顯示Zhang的捐款記錄,$
[root@m01 ~]# awk '/Zhang/ {printf $NF"\n"}' t1.txt
:250:100:175
:155:90:201

# 顯示全部以41開頭的ID號碼的人的全名和ID號碼
[root@m01 ~]# awk '$3~/^41/{print $1,$2,$3}' t1.txt 
Zhang Dandan 41117397
Liu Bingbing 41117483

# 顯示全部ID號碼最後一位數字是1或5的人的全名
[root@m01 ~]# awk '$3~/1$|5$/ {print $1,$2}' t1.txt |column -t
Zhang  Xiaoyu
Wu     Waiwai
Wang   Xiaoai
Li     Youjiu
Lao    Nanhai 
# awk默認使用空格分割,使用-F指定分割符
[root@m01 ~]# awk '/Zhang/{print $NF}' t1.txt|awk -F ":" '{print $3}'
100
90

# BEGIN在最開始的時候執行,讀取文件,NED在最後執行
[root@m01 ~]# awk '/Zhang/ {print $NF}' t1.txt |awk 'BEGIN{FS=":"}{print $3}END{print "我是最後執行的"}'
100
90
我是最後執行的

## 替換信息
# gsub(/須要替換的信息/,"修改爲什麼信息",將哪列信息進行修改)
[root@m01 ~]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}'    t1.txt
$155$90$201
awk '$0~/^$/ {gsub(/ /,/"-"/)};print $0'
## 排除信息
# 件中空行進行排除、文件中註釋信息進行排除
[root@m01 ~]# cat t1.txt 
姓       名        ID          捐款記錄
Zhang  Dandan    41117397    :250:100:175
Zhang  Xiaoyu    390320151   :155:90:201
#Meng   Feixue    80042789    :250:60:50
Wu     Waiwai    70271111    :250:80:75
Liu    Bingbing  41117483    :250:100:175
-----------------------------------------
Wang   Xiaoai    3515064655  :50:95:135
Zi     Gege      1986787350  :250:168:200
-----------------------------------------
Li     Youjiu    918391635   :175:75:300
-----------------------------------------
Lao    Nanhai    918391635   :250:100:175
-----------------------------------------
# 排除全部以#和-開頭的信息
[root@m01 ~]# awk '$0!~/^#|^-/' t1.txt 
姓       名        ID          捐款記錄
Zhang  Dandan    41117397    :250:100:175
Zhang  Xiaoyu    390320151   :155:90:201
Wu     Waiwai    70271111    :250:80:75
Liu    Bingbing  41117483    :250:100:175
Wang   Xiaoai    3515064655  :50:95:135
Zi     Gege      1986787350  :250:168:200
Li     Youjiu    918391635   :175:75:300
Lao    Nanhai    918391635   :250:100:175
## 統計信息
# 統計/etc/services文件中有井號開頭的行
[root@m01 ~]# awk '/^#/{i++}END{print i}' /etc/services
102	
# 統計系統中有多少個虛擬用戶 普通用戶
[root@m01 ~]#  awk '$NF~/bash/{i=i+1}END{print i}' /etc/passwd
    63
# 虛擬用戶數量
[root@m01 ~]#  awk '$NF!~/bash/{i=i+1}END{print i}' /etc/passwd
22

awk函數

awk 編程也容許在編程時使用函數

: << !
function 函數名(參數列表){ 
	函數體 
} 
!
# 刪除t1.txt文件中的-
[root@localhost ~]# sed '/-/d' t1.txt  -i 
# 定義函數 test ,包含兩個參數,函數體的內容是輸出這兩個參數,函數體是打印兩個參數
# 調用函數 test ,並向兩個參數傳遞值。
[root@m01 ~]# awk 'function test(a,b){printf a"\t"b"\n"} { test($1,$2) }' t1.txt |column -t
姓	   名
Zhang	Dandan
Zhang	Xiaoyu
#Meng	Feixue
Wu		Waiwai
Liu		Bingbing	
Zi		Gege
Wang	Xiaoai
Zi		Gege
Li		Youjiu	
Lao		Nanhai

awk調用腳本

對於小的單行程序來講,將腳本做爲命令傳遞給 awk 是很是簡單的,而對於多行程序就比較難處理。當程序是多行的時候,使用外部腳本是很適合的。首先在外部文件中寫好腳本,而後可 以使用 awk 的-f 選項,使其讀入腳本而且執行。

[root@m01 ~]# cat awk.sh 
#!/bin/bash
BEGIN{FS=":"}$3>=1000{print $0}

# 查找普通用戶
[root@m01 ~]# awk -f awk.sh /etc/passwd
python:x:1000:1000:python:/home/python:/bin/bash
linux:x:1002:1002::/home/linux:/bin/bash
java:x:1003:1003::/home/java:/bin/bash

6. 管道命令 |

命令 1 的正確輸出的結果做爲命令 2 的操做對象

# 查看全部/etc下的文件,從中過濾包含yum的文件
[root@m01 ~]# ll /etc | grep yum
drwxr-xr-x.  6 root root      100 Dec 30 16:36 yum
-rw-r--r--   1 root root      970 May 25 10:59 yum.conf
drwxr-xr-x.  2 root root     4096 Jun  1 14:29 yum.repos.d

#查看22遠程端口是否開啓 
[root@m01 ~]# netstat -tulnp |grep 22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      985/sshd            
tcp6       0      0 :::22                   :::*                    LISTEN      985/sshd
相關文章
相關標籤/搜索