做用:做用是在文件中提取和匹配符合條件的字符串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
用於匹配文件名,徹底匹配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
用於匹配字符串,包含匹配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位的小寫字母。 |
字符流編輯工具(行編輯工具)==按照每行中的字符進行處理操做編程
命令格式: sed [選項] ‘[動做]’ 文件名
c#
命令做用:數組
具體功能做用:bash
選項:
選項參數 | 做用 |
---|---|
-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
[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} 文件名
選項參數說明:
條件
awk保留字 | BEGIN | 在 awk 程序一開始時,還沒有讀取任何數據以前執行 |
---|---|---|
END | 在 awk 程序處理完全部數據,即將結束時執行 | |
關係運算符 | > | 大於 |
< | 小於 | |
>= | 大於等於 | |
<= | 小於等於 | |
== | 等於。用於判斷兩個值是否相等,若是是給變量賦值,使用 「=」號 | |
!= | 不等於 | |
A~B | 判斷字符串 A 中是否包含能匹配 B 表達式的子字符串 | |
A!~B | 判斷字符串 A 中是否不包含能匹配 B 表達式的子字符串 | |
正則表達式 | /正則/ | 在「//」中能夠寫入字符,也能夠寫正則表達式 |
動做
$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 編程也容許在編程時使用函數
: << ! 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 的-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
命令 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