-
第六章:文本處理工具
-
文本查看命令(cat)
-
分頁查看文件(more)
-
文本查看上下翻頁(less)
-
顯示頭部(head)
-
顯示尾部(tail)
-
按列抽取文本cut
-
合并文件paste
-
收集文本統計數據wc
-
文本排序sort
-
刪除重復uniq
-
比較文件diff
-
復制對文件改變patch
-
文本搜索工具grep
-
egrep 及擴展的正則表達式
-
作業:
第六章:文本處理工具
文本查看命令(cat)
命令簡介:
cat命令連接文件并打印到標準輸出設備上,cat經常用來顯示文件的內容,類似于下的type命令。 注意:當文件較大時,文本在屏幕上迅速閃過(滾屏),用戶往往看不清所顯示的內容。因此,一般用more等命令分屏顯示。為了控制滾屏,可以按
Ctrl+S
鍵,停止滾屏;按Ctrl+Q
鍵可以恢復滾屏。按Ctrl+C
(中斷)鍵可以終止該命令的執行,并且返回Shell提示符狀態
參數:
-n或-number:有1開始對所有輸出的行數編號;
-b或–number-nonblank:和-n相似,只不過對于空白行不編號;
-s或–squeeze-blank:當遇到有連續兩行以上的空白行,就代換為一行的空白行;
-A:顯示不可打印字符,行尾顯示“$”;
-e:等價于"-vE"選項;
-t:等價于"-vT"選項;
-E: 顯示行結束符$
演示:
[root@localhost ~]# cat 3.txt
1
[root@localhost ~]# cat -n 3.txt (-n 選項顯示行數編號)
1 1
[root@localhost ~]# cat > 4.txt <<end(把輸入內容追加到文本里面去)
> 22
> 33
> 44
> end
[root@localhost ~]# cat 4.txt (查看文本信息)
22
33
44
[root@localhost ~]# tac 4.txt (反過來顯示文本信息)
44
33
22
分頁查看文件(more)
該命令一次顯示一屏文本,滿屏后停下來,并且在屏幕的底部出現一個提示信息,給出至今己顯示的該文件的百分比:
–More–(XX%)
可以用下列不同的方法對提示做出回答:
文本查看上下翻頁(less)
less命令的作用與more十分相似,都可以用來瀏覽文字檔案的內容,不同的是less命令允許用戶向前或向后瀏覽文件,而
more
命令只能向前瀏覽。用less
命令顯示文件時,用PageUp
鍵向上翻頁,用PageDown
鍵向下翻頁。要退出less程序,應按Q
鍵。
顯示頭部(head)
head
命令用于顯示文件的開頭的內容。在默認情況下,head命令顯示文件的頭10行內容。
[root@localhost ~]# head -3 /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
顯示尾部(tail)
tail
命令用于輸入文件中的尾部內容。tail命令默認在屏幕上顯示指定文件的末尾10行。如果給定的文件不止一個,則在顯示的每個文件前面加一個文件名標題。如果沒有指定文件或者文件名為“-”,則讀取標準輸入。
[root@localhost ~]# tail -3 /etc/passwd
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
mageedu:x:1000:1000:mageedu:/home/mageedu:/bin/bash
實例:
有新信息就觸發顯示屏幕
[root@localhost ~]# tail -n 0 -f /var/log/messages &
按列抽取文本cut
cut命令用來顯示行中的指定部分,刪除文件中指定字段。cut經常用來顯示文件的內容,類似于下的type命令
-b:僅顯示行中指定直接范圍的內容;
-c:僅顯示行中指定范圍的字符;
-d:指定字段的分隔符,默認的字段分隔符為“TAB”;
-f:顯示指定字段的內容;
-n:與“-b”選項連用,不分割多字節字符;
實例:
顯示文件第一例信息
[root@localhost ~]# cat test.txt
No Name Mark Percent
01 om 69 91
02 jack 71 87
03 alex 68 98
[root@localhost ~]# cut -d" " -f1 test.txt
No
01
02
03
顯示文件前三位和第三位后面的信息
[root@localhost ~]# cat test2.txt
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
[root@localhost ~]# cut -c1-3 test2.txt
abc
abc
abc
abc
abc
[root@localhost ~]# cut -c3- test2.txt
cdefghijklmnopqrstuvwxyz
cdefghijklmnopqrstuvwxyz
cdefghijklmnopqrstuvwxyz
cdefghijklmnopqrstuvwxyz
cdefghijklmnopqrstuvwxyz
合并文件paste
paste 合并兩個文件同行號的列到一行 paste
命令用于將多個文件按照列隊列進行合并。
語法 paste
(選項)(參數)
選項 -d
<間隔字符>或–delimiters=
<間隔字符>:用指定的間隔字符取代跳格字符; -s
或——serial
串列進行而非平行處理。所有行合成一行顯示
實例:
[root@localhost ~]# echo "1" > 3.txt
[root@localhost ~]# echo "2" > 4.txt
[root@localhost ~]# paste 3.txt 4.txt
1 2
[root@localhost ~]# paste 3.txt 4.txt -d :
1:2
[root@localhost ~]# paste 3.txt 4.txt -d +
1+2
[root@localhost ~]# paste 3.txt 4.txt -d + |bc
3
收集文本統計數據wc
wc命令用來計算數字。利用wc指令我們可以計算文件的Byte數、字數或是列數,若不指定文件名稱,或是所給予的文件名為“-”,則wc指令會從標準輸入設備讀取數據。計數單詞總數、行總數、字節總數和字符總數
使用 -l 來只計數行數
使用 -w 來只計數單詞總數
使用 -c 來只計數字節總數
使用 -m 來只計數字符總數
$ wc story.txt
39 237 1901 story.txt
行數 | 字數 | 字符數 |
---|---|---|
39 | 237 | 1901 |
實例:
[root@localhost ~]# wc anaconda-ks.cfg
81 212 2633 anaconda-ks.cfg
[root@localhost ~]# wc anaconda-ks.cfg -l
81 anaconda-ks.cfg
文本排序sort
sort命令是在Linux里非常有用,它將文件進行排序,并將排序結果標準輸出。sort命令既可以從特定的文件,也可以從stdin中獲取輸入。
語法
sort(選項)(參數)
選項
-b:忽略每行前面開始出的空格字符;
-c:檢查文件是否已經按照順序排序;
-d:排序時,處理英文字母、數字及空格字符外,忽略其他的字符;
-f:排序時,將小寫字母視為大寫字母;
-i:排序時,除了040至176之間的ASCII字符外,忽略其他的字符;
-m:將幾個排序號的文件進行合并;
-M:將前面3個字母依照月份的縮寫進行排序;
-n:依照數值的大小排序;
-o<輸出文件>:將排序后的結果存入制定的文件;
-r:以相反的順序來排序;
-t<分隔字符>:指定排序時所用的欄位分隔字符;
+<起始欄位>-<結束欄位>:以指定的欄位來排序,范圍由起始欄位到結束欄位的前一欄位。
參數
文件:指定待排序的文件列表。
實例:
[root@localhost ~]# cut -d: -f7 /etc/passwd | sort -u |wc -l
5
刪除重復uniq
uniq 命令:從輸入中刪除重復的前后相接的行
參數:
-c: 顯示每行重復出現 的 次數
-d: 僅顯示重復過 的 行
-u: 僅顯示不曾重復 的 行
常和sort 命令一起配合使用:
[root@localhost ~]# sort userlist.txt | uniq -c
[root@localhost ~]# cut -d: -f7 /etc/passwd | sort | uniq -c | sort -u
1 /bin/sync
1 /sbin/halt
1 /sbin/shutdown
2 /bin/bash
33 /sbin/nologin
比較文件diff
diff命令在最簡單的情況下,比較給定的兩個文件的不同。如果使用“-”代替“文件”參數,則要比較的內容將來自標準輸入。diff命令是以逐行的方式,比較文本文件的異同處。如果該命令指定進行目錄的比較,則將會比較該目錄中具有相同文件名的文件,而不會對其子目錄文件進行任何比較操作。
比較兩個文件之間的區別
[root@localhost ~]# diff anaconda-ks.cfg aa.txt
5c5
< install
—
> instaii
注明第5 行有區別(改變)
復制對文件改變patch
diff 命令的輸出被保存在一種叫做“補丁”的文件中
使用 -u 選項來輸出“統一的(unified )”diff 格式文件,最適用于補丁文件。
patch 命令復制在其它文件中進行的改變(要謹慎使用?。?nbsp;
-i<修補文件>或–input=<修補文件>:讀取指定的修補問家你;
-b或–backup:備份每一個原始文件;
-u或–unified:把修補數據解譯成一致化的差異;
適用 -b 選項來自動備份改變了的文件
$ diff -u foo.conf-broken foo.conf-works > foo.patch
$ patch -b foo.conf-broken foo.patch
文本搜索工具grep
grep(global search regular expression(RE) and print out the line,全面搜索正則表達式并把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。
參數:
–color=auto: 對匹配到的文本著色顯示;
-v: 顯示不能夠被pattern 匹配到的行;
-i: 忽略字符大小寫
-n: : 顯示匹配的行號
-c: 統計匹配的行數
-o: 僅顯示匹配到的字符串;
-q: 靜默模式,不輸出任何信息
-A #: after, 后#行 行
-B #: before, 前#行 行
-C # :context, 前后各#行 行
-e :實現多個選項間的邏輯or 關系
grep –e ‘cat ’ -e ‘dog’ file
-w :整行匹配整個單詞
-E :使用ERE
基本正則表達式:BRE
擴展正則表達式:ERE grep -E
, egrep
元字符分類:字符匹配
、匹配次數
、位置錨定
、分組
基本正則表達式元字符
字符匹配:
. 匹配任意單個字符;
[] 匹配指定范圍內的任意單個字符
[^] 匹配指定范圍外的任意單個字符
* 匹配零個或多個字符 # ls *
? 匹配任何單個字符 # ls a?
~ 當前用戶家目錄
~username 用戶家目錄
~+ 當前工作目錄 # ls ~+
~- 前一個工作目錄 # ls ~-
[0-9] 匹配一個數字范圍
[a-z] 大寫和小寫字母
[A-Z] 大寫字母
[wxc] 匹配列表中的任何的一個字符
[^wxc] 匹配列表中的所有字符以外的字符
預定義的字符類: :#man 7 glob
[:digit:] :任意數字,相當于0-9
[:lower:] :任意小寫字母
[:upper:]: 任意大寫字母
[:alpha:]: 任意大小寫字母
[:alnum:] :任意數字或字母
[:space:] :空格
[:punct:] :標點符號
正則表達式
匹配次數:用在要指定次數的字符后面,用于指定前面的字符要出現的次數
* 匹配前面的字符任意次,包括0次 貪婪模式:盡可能長的匹配
.* 任意長度的任意字符
\? : 匹配其前面的字符0 或1次 次
\+ : 匹配其前面的字符至少1次 次
\{n\} : 匹配前面 的 字符n次 次
\{m,n\} : 匹配前面的字符至少m 次,至多n次 次
\{,n\} : 匹配前面的字符至多n次 次
\{n,\} : 匹配前面的 字符 至少n次
位置錨定:定位出現的位置
^ :行首錨定,用于模式的最左側
$ :行尾錨定,用于模式的最右側
^PATTERN$: 用于模式匹配整行
^$: 空行
^[[:space:]]*$ :空白行
\< 或 或 \b :詞首錨定,用于單詞模式的左側
\> 或 或 \b :詞尾錨定;用于單詞模式的右側
\<PATTERN\>
egrep 及擴展的正則表達式
egrep = grep -E
egrep [OPTIONS] PATTERN [FILE…]
擴展正則表達式的元字符:
字符匹配:
. 任意單個字符
[] 指定范圍的字符
[^] 不在指定范圍的字符
次數匹配:
* :匹配前面字符任意次
?: 0 或1次 次
+ :1 次或多次
{m} :匹配m次 次
{m,n} :至少m ,至多n次
位置錨定:
^ : 行首
$ : 行尾
\<, \b : 語首
\>, \b : 語尾
分組:
()
后向引用:\1, \2, ...
或者:
a|b
C|cat: C 或cat
(C|c)at:Cat 或cat
作業:
顯示/etc/passwd文件中不以/bin/bash結尾的行:
grep -v “/bin/bash$” /etc/passwd
找出/etc/passwd文件中的兩位數或三位數
grep "\<[0-9]\{2,3\}\>" /etc/passwd
找出/etc/rc.syslnit或者/etc/grub2.cfg文件中,以至少一個空白字符開頭,且后面非空白字符的行
grep “^[[:space:]]\+[^[:space:]]” /etc/passwd
找到 “netstat -tan” 命令的結果中以“LISTEN”后跟0,1或多個空白字符結尾的行
netstat -tan | grep “LISTEN[[:space:]]*$”
分組實驗:
He loves his loves
He likes his loves
She likes her liker
She lover her liker
grep "\(l..e).*\1" lover.txt
找出/proc/meminfo文件中,所有以大寫或小寫S開頭的行,三種方式
grep -i “^s” /porc/meminfo
grep "^[sS]" /porc/meminfo
grep -E "^(s|S)" /porc/meminfo
顯示系統上 root,cnetos或者user1用戶的相關信息;
grep -E “^(root|centos|user1)\>” /etc/passwd
找出/etc/rc.d/init.d/functions文件中某單詞后面跟一個小括號的行
grep -E -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
使用echo命令輸出一絕對路徑,使用egrep取出基名
echo /etc/sysconfig/ | gerp -E -o "[^/]+/?$"
添加用戶bash,testbash,basher以及nologin(其shell為/sbin/nologin),然后找出/etc/passwd/文件中用戶名同shell名的行
grep -E “^([^:]).*\1$” /etc/passwd
取本機ip地址
[root@localhost ~]# ifconfig | grep -E -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | grep -E -v "255|127.0.0.1"
192.168.119.131
取各分區利用率的數值
[root@localhost ~]# df | grep -E "^/dev/sd*" | grep -E -o "[[:digit:]]*[$%]"
1%
13%
29%
[root@localhost ~]# df | grep "^/dev/sb*" | tr -s " " ":" |cut -d: -f1,5
/dev/sda2:1%
/dev/sda3:13%
/dev/sda1:29%
統計/etc/init.d/functions 文件中每個單詞出現的次數,并按頻率從高到低顯示
cat /etc/init.d/functions | tr -cs '[:alpha:]' "\n" | sort |uniq -c| sort -n -r
/etc/rc.d/init.d/functions或/etc/rc.d/init.d/functions/” 取目錄名
[root@localhost ~]# echo "/etc/rc.d/init.d/functions/" | egrep -o "/.*[^/]" | egrep -o "/.*/"
/etc/rc.d/init.d/
正則表達式表示身份證號
echo "ID CARD :41272519940000301x" | egrep -o "\<[1-9][0-9]{5}(19[0-9][0-9]|200[0-9]|201[0-6])(0[0-9]|1[0-2])([0-2][0-9]|3[0-1])[0-9]{3}([0-9]|x)\>"
正則表達式表示手機號
echo "Phone number : 18321401988" | egrep -o "\<1(3|5|7|8)[0-9]{9}\>"
正則表達式表示郵箱
echo "is who : zhang132485@163.com" |grep -o "\<[[:alnum:]]\+@[[:alnum:]]\+\.com"
正則表達式表示QQ號
echo "fajfahghjfas 939488549" | egrep -o "\<[1-9][0-9]{4,9}\>
原創文章,作者:M20_he,如若轉載,請注明出處:http://www.www58058.com/31317