第六章:文本處理工具

  • 第六章:文本處理工具

    • 文本查看命令(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:排序時,除了040176之間的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 -Eegrep 
元字符分類:字符匹配、匹配次數、位置錨定、分組

基本正則表達式元字符 
字符匹配:

.       匹配任意單個字符;
[]      匹配指定范圍內的任意單個字符
[^]     匹配指定范圍外的任意單個字符
*       匹配零個或多個字符   # 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…] 
擴展正則表達式的元字符: 
字符匹配:

.  任意單個字符
[]  指定范圍的字符
[^]  不在指定范圍的字符

次數匹配:

* :匹配前面字符任意次
?: 01次 次
+ :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}\>

作者:馬哥教育面授20班

         M20_he

原創文章,作者:M20_he,如若轉載,請注明出處:http://www.www58058.com/31317

(0)
M20_heM20_he
上一篇 2016-08-10
下一篇 2016-08-10

相關推薦

  • Shell腳本編程基礎

    1編程基礎 程序:指令+數據 程序編程分格: 過程式:以指令為中心,數據服務于指令 對象式:以數據為中心,指令服務于數據 Shell程序:提供了編程能力,解釋執行 程序的執行方式 計算機:運行二進制指令 編程語言: 低級:匯編 高級:編譯:高級語言->編譯器->目標代碼 編譯性語言編寫的程序通常是需要通過編譯器去轉換成計算機可以識別的二進制文件,…

    2017-11-27
  • 遷移分區

          1 備份/home    2 創建分區 /dev/sdc1 10G   [root@localhost ~]# du -sh /home   52K /home   3 格式化分區   [root@localhost …

    Linux干貨 2017-04-25
  • 第三周作業

      1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 who | cut -d" " -f1 | sort -u who | cut -d" " -f1 | uniq 2、取出最后登錄到當前系統的用戶的相關信息。    who | tail -1 …

    Linux干貨 2016-11-19
  • 磁盤管理

    CHS cylinder-head-sector cylinder柱面=track*head=512*63*256=8M  磁盤分區 為什么是分區? ? 優化I/O 性能 ? 實現磁盤空間配額限制 ? 提高修復速度 ? 隔離系統和程序 ? 安裝多個OS ? 采用不同文件系統   MBR:使用32位表示扇區數量,按每扇區512字節計算,每個…

    Linux干貨 2016-08-29
  • N25第一周作業

    一.計算機基礎知識     1.計算機是什么?         計算機是一種能夠按照指令對各種信息進行自動加工和處理的電子設備     2.計算機的組成?       &…

    Linux干貨 2016-12-06
  • 【N25第六周作業】VIM、crontab、簡單腳本

    請詳細總結vim編輯器的使用并完成以下練習題 第二周有寫過vim的用法,請查看連接: 周期性任務計劃:cron 服務程序: cronie:主程序包,提供了crond守護進程及相關輔助工具; 確保crond守護進程(daemon)處于運行狀態: CentOS 7: systemctl  status  cron…

    Linux干貨 2016-12-27
欧美性久久久久