Linux的文本內容檢索-處理
制作人:全心全意
文本查找
grep:搜索以文件輸入(或者是標准輸入,如果沒有指定文件名,或者給出的文件名是-的話),尋找含有與給定的模式 PATTERN相匹配的內容的行。默認情況下, grep將把含有匹配內容的行打印出來。另外,也可以使用兩個變種程序 egrep 和 fgrep 。 Egrep與 grep -E 相同。 Fgrep 與 grep -F 相同。
用法:
grep [選項] 模式 [文件...]
grep [選項] [-e 模式 | -f 文件] [文件...]
-i:忽略大小寫
--color:匹配到的字符串高亮顯示
-v:反向查找
-o:僅顯示匹配到的字符串本身,不顯示行內沒有匹配到的內容
-E:使用擴展正則表達式,可使用egrep代替
-A:指定顯示匹配行后面多少行
-B:指定顯示匹配行前面多少行
-C:指定顯示匹配行前面和后面多少行
模式:文本字符和正則表達式元字符組合而成
注:正則的的特殊字符的含義
.:匹配任意單個字符
[]:匹配指定范圍內的單個字符
字符集合:
[:digit:]:數字
[:lower:]:小寫字母
[:upper:]:大寫字母
[:punct:]:標點符號
[:space:]:空白字符
[:alpha:]:所有字符
[:alnum:]:所有數字和字母
[^]:匹配指定范圍外的單個字符
*:表示匹配前面的字符任意次
\?:表示匹配前面的字符0次或1次
\{m,n\}:表示匹配前面的字符最少m次,最多n次
\{1,\}:最少1次,多了不限
\{0,3\}:最少0次,最多3次
\<:其后面的任意字符必須作為單詞首部出現(單詞可以包含數字、字母)
\>:其前面的任何字符必須作為單詞尾部出現
\<和\>都可以使用\b代替
^:行首
$:行尾
\(\):分組,例如\(ab\)*中將ab看做一個整體,多用於后向引用,后向引用使用\1、\2分別調用
#查找/etc/passwd文件中包含root的行 [root@localhost ~]# grep 'root' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin #查找/etc/inittab文件中以數字為結尾的行 [root@localhost ~]# grep '[[:digit:]]$' /etc/inittab # multi-user.target: analogous to runlevel 3 # graphical.target: analogous to runlevel 5
#分組的使用 #查找tt.txt文件中分組匹配到like,后面依舊是前面匹配到的內容 [root@localhost ~]# cat tt.txt The like is liker. The like is lover. [root@localhost ~]# grep '\(l..e\).*\1' tt.txt The like is liker.
流編輯器
sed:用於過濾和轉換文本的流編輯器
用法:sed [選項]... {地址編輯命令(腳本)} [輸入文件]...
地址:
起始行,結束行:1,100為第1到100行,$表示最后一行
/模式(正則)/:匹配到的行
/模式1/,/模式2/:第1次匹配模式1的行開始到第1次匹配模式2的行結束中間的所有行
精確的行:5為第五行
起始行,+N:從起始行開始向后N行
編輯命令:
d:刪除符合條件的行
p:顯示符合條件的行,不使用-n,輸出效果不好
a \string:在指定的行后面增加新行,內容為string
i \string:在指定的行前面增加新行,內容為string
r FILE:將指定的文件的內容添加至符合條件行的后面
w FILE:將指定范圍內的內容另存至指定的文件中
s/模式/string/:查找匹配模式的字符串並替換為指定的string,分隔符///可以使用其他的代替,例如###
g:全局替換,默認只替換每行第一個
i:忽略字符大小寫
&:在string中表示引用模式匹配的整個串
y/字符集1/字符集2/:將字符集1中的字符替換為字符集2中對應的字符
-n:靜默模式,不再默認顯示模式空間內容
-i:直接修改原文件
-e:同時指定多個地址編輯命令(格式為sed -e 腳本 -e 腳本 -e 腳本...)
-f FILE:文件中為腳本命令,每一行為一個腳本,然后依次使用腳本對文件進行處理
-r:使用擴展正則表達式,默認只支持基本正則表達式
工作模式:逐行讀取文本,將符合條件的文本行讀取到內存空間(模式空間),而后使用編輯命令進行編輯,將結果顯示到屏幕,默認對源文件不進行任何處理,處理的僅是模式空間讀取過來的副本。
#sed中替換可以使用分組 [root@localhost ~]# cat 5.txt I like you I love you #將l..e中的L換成大寫 [root@localhost ~]# sed 's/l\(..e\)/L\1/' 5.txt I Like you I Love you #使用&進行引用整個串 [root@localhost ~]# sed 's/l..e/&r/' 5.txt I liker you I lover you
[root@master tt]# cat 1.txt 11 2 3 #使用字符轉換1.txt中的字符 [root@master tt]# sed 'y/123/abc/' 1.txt aa b c #使用w將指定范圍內的內容寫入文件 [root@master tt]# sed -n '1,2 w output' 1.txt [root@master tt]# cat output 11 2
報告生成器
awk:根據輸入的信息,將所輸入的信息格式化后進行輸出。進行過一次更新,下載Linux下使用的是gawk。
用法:
awk [選項] ‘腳本’ 文件1,文件2...
awk [選項] ‘模式 { 動作 }’ 文件1,文件2...
-F:指定分隔符,默認使用空格作為分隔符,分隔后使用$1/$2/$3...調用,$0表示整行內容
-v:定義awk變量
模式:
正則表達式,格式為/表達式/
[root@localhost ~]# awk -F: '/^r/{print $1}' /etc/passwd root rpc rtkit
表達式
#顯示UID為0的用戶名 [root@localhost ~]# awk -F: '$3 == 0 {print $1}' /etc/passwd root #第7個字段是否與模式匹配 [root@localhost ~]# awk -F: '$7~"bash$" {print $1}' /etc/passwd root zq
指定范圍,格式為模式1,模式2,模式1開始,模式2結束,模式建議使用表達式,測試時正則出現異常
BEGIN/END:特殊模式,僅在awk命令執行前運行一次或結束前運行一次
[root@localhost ~]# awk 'BEGIN{print "開始"} {print $1,$4} END{ print "結束" }' 1.txt 開始 My quanxinquanyi. This text. 結束
Empty(空模式):文件的每一行都做處理,模式什么也不寫,直接寫動作命令
[root@localhost ~]# awk '{print $1,$4}' 1.txt My quanxinquanyi. This text.
awk的內置變量
FS:指定輸入內容的分隔符,默認是空白字符,等同於選項-F
RS:指定輸入內容的換行符,默認是換行符
OFS:指定輸出內容的分隔符,默認是空白字符
ORS:指定輸出內容的換行符,默認是換行符
awk的內置數據變量
NR:相對於所有文件,awk命令所處理的行數
NF:當前行的字段個數
FNR:相對於當前處理的文件,awk命令所處理的行數,在指定多個文件時使用
awk用戶自定義變量
gawk允許用戶自定義自己的變量,以便在程序代碼中使用,變量名命名規則與大多數編程語言相同,只能使用字母、數字和下划線,切不能以數字開頭,gawk變量名稱區分字符大小寫。
#用戶自定義變量 [root@localhost ~]# awk 'BEGIN{ tt="test"; print tt}' test #使用選項用戶自定義變量 [root@localhost ~]# awk -v tt="test" BEGIN'{print tt}' test
動作:
print:輸出內容,多個內容使用逗號分隔
printf:自定義格式化輸出內容,不會自動打印換行符
用法:printf 格式 內容1,內容2...
格式:格式之間不需要使用逗號進行分隔
%c:顯示字符的ASCII碼
%d,%i:十進制的整數
%e,%E:科學計數法顯示數值
%f:顯示浮點數
%g,%G:以科學計數法的格式或浮點數的格式顯示數值
%s:顯示字符串
%u:無符號整數
%%:顯示%號自身
修飾符:修飾符在格式中使用,例如(%-c、%+d)
N:顯示寬度,N為數字
-:左對齊
+:顯示數值符號
#以10個字符作為寬度,默認右對齊 [root@localhost ~]# awk '{printf "%10s\n",$1}' 1.txt My This #以10個字符作為寬度,使用左對齊 [root@localhost ~]# awk '{printf "%10-s\n",$1}' 1.txt My This
#顯示用戶名和UID,用戶名以20個字符顯示並且左對齊,UID以5個字符顯示,默認對齊 #格式之間無需使用分隔符 [root@localhost ~]# awk -F: '{printf "%-20s%5d\n",$1,$3}' /etc/passwd root 0 bin 1 daemon 2 ......
表達式
控制語句:if、if-else、while、do-while、for、case、break和continue、next(提前結束此行的處理,進入下一行)
#判斷用戶名是否為root,root為管理員,否則為普通用戶 [root@localhost ~]# awk -F: '{if ($1=="root") print $1,"管理員";else print $1,"普通用戶"}' /etc/passwd root 管理員 bin 普通用戶 daemon 普通用戶
#輸出/etc/中字段的字符個數大於等於4的字段 [root@bogon ~]# awk -F: '{i=1;while(i<=NF){if (length($i) >= 4) print $i;i++}}' /etc/passwd root root
#統計默認shell分別使用的用戶數 #awk中數組的下邊可以使用字符串,不指定值默認為1,for循環中A的值為數組的下標 [root@bogon ~]# awk -F: '{shell[$NF]++}END{for(A in shell) {print A,shell[A]}}' /etc/passwd /bin/sync 1 /bin/bash 2 /sbin/nologin 38 /sbin/halt 1 /sbin/shutdown 1
輸入輸出語句
awk的操作符
算術操作符:
**:次方
*:乘法
/:除法
+:加法
-:減法
%:取余
賦值操作符:
=、+=、-=、*=、/=、%=、^=、**=、++、--
注意:如果某模式為*號,此時使用/*/可能會有語法錯誤,應以/[*]/替代
比較操作符:
<、>、<=、>=、==、!=、
x ~ y:x為字符串,y為模式,y模式可以匹配x為真
x !~ y:y模式不可以匹配x為真
邏輯關系符
&&、||
條件表達式
三目運算符:條件?值1:值2
awk的內置函數
length([string]):返回string字符串中的字符個數
cut:在文件的每一行中提取片斷
用法:cut [選項] [文件]
-d,--delimiter:指定字段分隔符,默認使用TAB鍵作為分隔符(非空格)
-f,--fields:指定輸出的字段
[root@slave2 ~]# cat 1.txt 123 345 456 567 #指定空格為分隔符,輸出第2個字段 [root@slave2 ~]# cut -d" " -f2 1.txt 345 #輸出第1到3個字段 [root@slave2 ~]# cut -d" " -f1-3 1.txt 123 345 456 #輸出第1和第4個字段 [root@slave2 ~]# cut -d" " -f1,4 1.txt 123 567
文本排序
sort:對文本文件的行進行排序,默認根據升序進行排序,標准是首個字符在ASCII碼表中的位置
用法:sort [選項] [文件]
-b:忽略行首的空格
-n:按照數值大小排序,暗含-b
-r:顛倒默認的排序,也就是降序
-o:將排序結果輸出到指定文件
-t:指定字段分隔符
-k:指定排序的字段
-u:對排序后重復的行進行去重,對應命令uniq(必須排序后使用,去重時相同的行必須相鄰)
-f:排序時忽略字符大小寫
#根據UID對文件進行數值排序 [root@slave2 ~]# sort -n -t: -k3 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin ......
uniq:刪除排序文件中的重復行,與sort結合使用(必須排序后使用,去重時相同的行必須相鄰)
用法:uniq [選項] 輸入流
-d:僅顯示重復的行
-D:顯示所有重復的行
-c:顯示每一行重復的次數
[root@slave2 ~]# cat 1.txt 123 234 123 456 456 #對重復的行進行去重 [root@slave2 ~]# sort -n 1.txt | uniq 123 234 456 #統計排序后重復的行的次數 [root@slave2 ~]# sort -n 1.txt | uniq -c 2 123 1 234 2 456 #僅顯示重復的行 [root@slave2 ~]# sort -n 1.txt | uniq -d 123 456
文本統計
wc:輸出文件中的行數、單詞數、字節數
用法:wc [選項] [輸入流]
-l:顯示行數
-w:顯示單詞數
-c:顯示字節數
-m:顯示字符個數
-L:顯示最長的一行包含多少個字符
[root@slave2 ~]# wc /etc/passwd 48 97 2519 /etc/passwd #48行 97的單詞 2519個字節
字符處理
tr:轉換或刪除字符(不能指定文件,可以使用輸入重定向或管道)
用法:tr [選項] 字符集1 [字符集2]
-d:刪除指定字符集中的字符
#對輸入字符進行字符集對應替換 [root@slave2 ~]# echo "abc" | tr 'ab' 'AB' ABc
[root@slave2 ~]# cat 1.txt acz #將1.txt中小寫字母全部轉換為大寫字母 [root@slave2 ~]# tr 'a-z' 'A-Z' < 1.txt ACZ #刪除輸入中指定字符集中包含的字符 [root@slave2 ~]# tr -d 'c' < 1.txt az
文本合並
paste:合並文件各行
用法:paste [選項] [文件]...
-d:指定分隔符
[root@slave1 zq20191114]# cat 1.txt 1 2 3 [root@slave1 zq20191114]# cat a.txt a b c #合並文件 [root@slave1 zq20191114]# paste 1.txt a.txt 1 a 2 b 3 c #合並文件,使用:作為分隔符 [root@slave1 zq20191114]# paste -d: 1.txt a.txt 1:a 2:b 3:c
文件分割
split:分割文件
用法:split [選項] 文件 輸出文件前綴
-l:指定按行分割,不可對二進制文件使用
-b:指定按文件大小分割
[root@slave1 tt]# cat 2.txt 1 2 3 #指定按行分割文件,每一行分割為1個文件 [root@slave1 tt]# split -l 1 2.txt test_ [root@slave1 tt]# ll 總用量 16 -rw-r--r-- 1 root root 6 5月 21 17:35 2.txt -rw-r--r-- 1 root root 2 5月 21 17:35 test_aa -rw-r--r-- 1 root root 2 5月 21 17:35 test_ab -rw-r--r-- 1 root root 2 5月 21 17:35 test_ac #=========================== [root@master tt]# du -sh bash 940K bash #指定按大小分割文件,每500K分割為1個文件 [root@master tt]# split -b 500K bash base_ [root@master tt]# ll 總用量 1880 -rw-r--r-- 1 root root 512000 5月 21 17:38 base_aa -rw-r--r-- 1 root root 448392 5月 21 17:38 base_ab -rwxr-xr-x 1 root root 960392 5月 21 17:38 bash