文字處理工具之grup && 正規表示式

好名字1995發表於2018-07-14
 
Linux文字處理三劍客
grep:文字過濾(模式:pattern)工具
grep, egrep, fgrep(不支援正規表示式搜尋)
sed:stream editor,文字編輯工具
awk:Linux上的實現gawk,文字報告生成器
cat: 檔案檢視命令:
-E: 顯示行結束符$
-n: 對顯示出的每一行進行編號
-A:顯示所有控制符
-b:非空行編
-s:壓縮連續的空行成一行
more:less:分頁顯示,類似於man的檢視格式
tac :以列為單位倒著檢視檔案
rev :以行為單位倒著檢視檔案
 
head
預設顯示開頭10行,
預設10行
-nX:X表示數字
-X
tail: 預設10行
-nX
-X
-f 基於檔案描述符追蹤
-F 基於檔名追蹤
tailf: 基於檔案描述符追蹤,如果檔案不增長,它不會訪問磁碟檔案,減少了IO訪問
 
centos6:
service network start或restart或stop:啟動或重啟或關閉網路服務
chkconfig iptables on或off :設定開機啟動或關閉防火牆
1.service httpd start
2.echo hello > /var/www/html/index.html
 
df: 檢視磁碟的掛載情況
lsblk:檢視塊裝置
df |tr -s ” ” | cut -d” ” -f5 |cut -d% -f1 取出磁碟的使用情況
df |tr -s ” ” % |cut -d% -f5
ifconfig | head -2|tail -1|tr -s ” “|cut -d” ” -f3 取IP地址
172.18.187.75
paste:合併兩個檔案同行號的列到一行
 
seq:只能列出數字
[root@centos6 ~]#seq 1 5 > f1
[root@centos6 ~]#seq 6 10 > f2
[root@centos6 ~]#paste f1 f2
1 6
2 7
3 8
4 9
5 10
paste -d ” ” f1 f2 :作為分隔符
[root@centos6 ~]#paste -d “:” f1 f2
1:6
2:7
3:8
4:9
5:10
paste -s f1 把指定檔案多行變為一行
wc:計數單詞總數、行總數、位元組總數和字元總數,可以對檔案或stdin中的資料執行
[root@centos6 ~]#wc /etc/passwd
62 83 2752 /etc/passwd
行數 字數 位元組數
常用選項
-l 只計數行數
-w 只計數單詞總數
-c 只計數字節總數
-m 只計數字符總數
-L 顯示檔案中最長行的長度
export :宣告變數(全域性變數)LC_COLLATE=C
sort: 預設排序方式受LC_COLLATE影響為UTF-8按首字母來排
sort -r 倒序
sort -u 去重
sort -t 指定分隔符
sort -k以第幾列
sort -t:- k3 -n /etc/passwd 以,取第三列:作為分隔符,加-n時以數字排序
df |tr -s ” ” % |cut -d% -f5 |sort -nr |head -1 jieguo 100
sort -n 將指定列當做整體並以數字排序
cut -d: -f1,3 /etc/passwd |sort -t: -k2 -nr
cat /etc/passwd |sort -t: -k3 -n
uniq:命令:從輸入中刪除前後相接的重複的行
uniq [OPTION]… [FILE]…
-c: 顯示每行重複出現的次數
-d: 僅顯示重複過的行
-u: 僅顯示不曾重複的行
連續且完全相同方為重複
常和sort 命令一起配合使用:
sort userlist.txt | uniq -c
[root@instructor_v6(nanyibo) html]# cat /var/log/httpd/access_log |cut -d” ” -f1 |sort |uniq -c |sort -n -r |head
180 172.18.118.136
102 172.18.118.108
72 192.168.20.1
71 172.18.118.133
70 172.18.118.117
67 172.18.118.127
59 172.18.118.99
58 172.18.118.116
55 172.18.118.94
54 172.18.118.152
diff 和 patch:比較兩個檔案之間的區別
 
diff f1 f2: 比較兩個檔案f1 ,f2之間的區別
diff -u oldfile newfile > file.patch
 
sed
 
用法:
sed [option]… `script` inputfile…
常用選項:
-n:不輸出模式空間內容到螢幕,即不自動列印
-e: 多點編輯
-f:/PATH/SCRIPT_FILE: 從指定檔案中讀取編輯指令碼
-r: 支援使用擴充套件正規表示式
-i.bak: 備份檔案並原處編輯
script:`地址命令
地址定界:
(1) 不給地址:對全文進行處理
(2) 單地址:
#: 指定的行,$:最後一行
/pattern/:被此處模式所能夠匹配到的每一行
(3) 地址範圍:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步進
1~2 奇數行
2~2 偶數行
 
編輯命令:
d: 刪除模式空間匹配的行,並立即啟用下一輪迴圈
p:列印當前模式空間內容,追加到預設輸出之後
a []text:在指定行後面追加文字
支援使用
實現多行追加
i []text:在行前面插入文字
c []text:替換行為單行或多行文字
w /path/somefile: 儲存模式匹配的行至指定檔案
r /path/somefile:讀取指定檔案的文字至模式空間中
匹配到的行後
=: 為模式空間中的行列印行號
!:模式空間中匹配行取反處理
替換 s///:查詢替換,支援使用其它分隔符,s@@@,s###
替換標記:
g: 行內全域性替換
p: 顯示替換成功的行
w /PATH/TO/SOMEFILE:將替換成功的行儲存至檔案中
 
高階編輯命令
P:列印模式空間開端至
內容,並追加到預設輸出之前
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出資料覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:讀取匹配到的行的下一行追加至模式空間
d: 刪除模式空間中的行
D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文字,
並不會讀取新的輸入行,而使用合成的模式空間重新啟動迴圈。如果模式空間
不包含換行符,則會像發出d命令那樣啟動正常的新迴圈
 
例項:
 
seq 1 5 |sed 2d
ifconfig |sed -n `2p`
cat pets |sed “2ahello
123”
cat pets |sed “2ihello
123”
cat pets |sed “2chello
123”
cat /app/pets |sed `1,3w /app/pet.1`
cat -n /app/pets |sed `2r /app/pet.1`
seq 1 5 |sed -n `2!p`
高階用法
 
seq 1 10 |sed -n `n;p` 僅列印偶數行
seq 1 10|sed -n `2~2p`
2
4
6
8
10
[root@instructor_v7(nanyibo) ~]# seq 1 10|sed `1!G;h;$!d` 倒序顯示
[root@instructor_v7(nanyibo) ~]# seq 1 10|sed `N;D` 列印最後一行
[root@instructor_v7(nanyibo) ~]# seq 1 10|sed `$!N;$!D` 列印最後兩行
[root@instructor_v7(nanyibo) ~]# seq 1 10|sed `$!d` 列印最後一行
[root@instructor_v7(nanyibo) ~]# seq 1 10|sed `G` 每一行後加一個空行
[root@instructor_v7(nanyibo) ~]# seq 1 10|sed `g` 將所有行變為空行
[root@instructor_v7(nanyibo) ~]# cat seq10 |sed `/^$/d;G` 將多空行變為一個空 行,沒有空行的加一個空行
[root@instructor_v7(nanyibo) ~]# seq 1 10 |sed `n;d` 只列印奇數行
[root@instructor_v7(nanyibo) ~]# seq 1 10 |sed -n `1!G;h;$p` 倒序列印
sed -e `/^#NameVirtual/s/#//` 檔案中的開頭的#去掉
sed -e `/^#NameVirtual/s/#//` -e `^#<VirtualHost/,/^#<VirtualHost/s/#//` /etc/httpd/conf/httpd.conf 去掉檔案中開頭的#
sed -r `s/(.*)/magedu1/` /etc/passwd 把這個檔案的頭一個字母替換為。。
 
用sed取IP地址:ifconfig |sed -n `2p` | sed -r `s@.*inet(.*) net.*@1@`
192.168.30.110
ifconfig | sed -r `2!d;s@(.*inet)(.*)( net.*)@2@`
 
ifconfig |sed -n `2p` |sed `s/.*inet //` |sed `s/ netmask.*//`
 
sed -e `/^#NameVirtual/s/#//` 檔案中的開頭的#去掉
sed -e `/^#NameVirtual/s/#//` -e `^#<VirtualHost/,/^#<VirtualHost/s/#//` /etc/httpd/conf/httpd.conf 去掉檔案中開頭的#
 
seq 1 10 |sed -n `n;p` 只顯示偶數
seq 1 10 |sed -n `2~2p`
seq 1 10 |tac tac表示倒敘排數字
seq 1 10 |sed `N;D` 倒敘排取得的第一個數字
[root@centos7 ~]# seq 1 10 |sed `$!N;$!D`
9
10
sed -r `s/(.*)/magedu1/` /etc/passwd 把這個檔案的頭一個字母替換為。
 
例項:
sed ‘2p’ /etc/passwd
sed –n ‘2p’ /etc/passwd
sed –n ‘1,4p’ /etc/passwd
sed –n ‘/root/p’ /etc/passwd
sed –n ‘2,/root/p’ /etc/passwd 從2行開始
sed -n ‘/^$/=’ file 顯示空行行號
sed –n –e ‘/^$/p’ –e ‘/^$/=’ file
sed ‘/root/asuperman’ /etc/passwd行後
sed ‘/root/isuperman’ /etc/passwd 行前
sed ‘/root/csuperman’ /etc/passwd 代替行
 
sed ‘/^$/d’ file
sed ‘1,10d’ file
nl /etc/passwd | sed ‘2,5d’
nl /etc/passwd | sed ‘2a tea’
sed `s/test/mytest/g` example
sed –n ‘s/root/&superman/p’ /etc/passwd 單詞後
sed –n ‘s/root/superman&/p’ /etc/passwd 單詞前
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets
sed –i.bak ‘s/dog/cat/g’ pets
 
 
grep: 文字過濾(模式:pattern)工具
grep, egrep, fgrep(不支援正規表示式搜尋)
模式:由正規表示式字元及文字字元所編寫的過濾條件
sed:stream editor,文字編輯工具
awk:Linux上的實現gawk,文字報告生成器
grep +引數+匹配內容+檔案
–color=auto 關鍵字高亮顯示,在centos7當中預設做為別名,對匹配到的文字著色顯示
轉義 一次
[.]放到括號裡表示.本身
-v 顯示不被匹配到的行
-i 忽略關鍵字的大小寫
-c 顯示匹配行的數量
-o 僅顯示匹配到的關鍵字
-q 靜默輸出,不列印過濾的結果,也可以用 &> /dev/null
-A x 當前行及後x行
-B x 當前行及前x行
-C x 當前行及前後x行
nmap -v -sP 172.18.118.0/24 |grep -B1 `Host is up` |grep for |cut -d” ” -f5
-e 關鍵字1 -e 關鍵字2 或者 “關鍵字1|關鍵字2” 表示邏輯或
-w 匹配整個單詞 表示字元邊界 也可以用 “<關鍵字>”
-E 或 egrep 表示使用擴充套件正規表示式
-F 或 fgrep 不使用正規表示式
 
 
正規表示式:
 
程式支援:grep,sed,awk,vim, less,nginx,varnish
man 7 regex
檔名萬用字元當中 * 表示 0或多個任意字元 ? 表示任何一個單一字元
. 表示任何字元
[] 匹配指定範圍內的任意單個字元
[^] 匹配指定範圍外的任意單個字元
[:alnum:] 字母和數字
[:alpha:] 代表任何英文大小寫字元,亦即 A-Z, a-z
[:lower:] 小寫字母 [a-z]
[:upper:] 大寫字母 [A-Z]
[:blank:] 空白字元(空格和製表符)
[:space:] 水平和垂直的空白字元(比[:blank:]包含的範圍廣)
[:cntrl:] 不可列印的控制字元(退格、刪除、警鈴…)
[:digit:] 十進位制數字 [0-9]
[:xdigit:]十六進位制數字
[:graph:] 可列印的非空白字元
[:print:] 可列印字元
[:punct:] 標點符號
[A-Z0-9] 表示大寫字元或數字
 
次數匹配
 
匹配次數:用在要指定次數的字元後面,用於指定前面的字元要出現的次數
* 匹配前面的字元任意次,包括0次
貪婪模式:儘可能長的匹配
.* 任意長度的任意字元
? 匹配其前面的字元0或1次
+ 匹配其前面的字元至少1次
{n} 匹配前面的字元n次
{m,n} 匹配前面的字元至少m次,至多n次
{,n} 匹配前面的字元至多n次
{n,} 匹配前面的字元至少n次
 
位置錨定:定位出現的位置
^ 行首錨定,用於模式的最左側
$ 行尾錨定,用於模式的最右側
^PATTERN$ 用於模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
grep -v “^[[:space:]]*$” passwd 去除檔案中的空白行
< 或 詞首錨定,用於單詞模式的左側
> 或 詞尾錨定;用於單詞模式的右側
<PATTERN> 匹配整個單詞
grep “<root>” passwd
 
分組
 
分組:() 將一個或多個字元捆綁在一起,當作一個整體進行處理,如:(root)+
分組括號中的模式匹配到的內容會被正規表示式引擎記錄於內部的變數中,這些變數的命 名方式為: 1, 2, 3, …
1 表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字
示例: (string1+(string2)*)
1 :string1+(string2)*
2 :string2
後向引用:引用前面的分組括號中的模式所匹配字元,而非模式本身
或者:|
示例:a|b: a或b C|cat: C或cat (C|c)at:Cat或cat
 
實驗:通過以下檔案,找出以rxxt開頭且以相同rxxt結尾,並uid與gid相同的使用者
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
rcct:x:1:1:bin:/bin:/sbin/rcct
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
roat:x:4:7:lp:/var/spool/lpd:/sbin/roat
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:Root:/sbin:/sbin/shutdown
roat:x:6:0:Root:/sbin:/sbin/root
halt:x:7:0:halt:/sbin:rooter:/halt
rbbt:x:8:12:mail:/var/spool/mail:/sbin/root
operator:x:11:0:operator:/root1:/sbin/root
root:x:100:100:games:/usr/games:/sbin/root
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
 
cat passwd |grep “^(<r..t>).*([0-9]+):2.*1$”
 
 
擴充套件正規表示式的元字元:egrep = grep -e
字元匹配:
.任意單個字元
[] 指定範圍的字元
[^] 不在指定範圍的字元
 
位置錨定:
^ :行首
$ :行尾 <, :語首 >, :語尾
分組:
()
後向引用:
1,
2, …
或者:
a|b: a或b
C|cat: C或cat
(C|c)at:Cat或cat

 

 

相關文章