magedu_20160804

文本處理工具和grep過濾工具以及正則表達式 

  一.文本處理工具相關命令

   前面課程中曾經使用過cat,head,tail命令查看相關文件,head,tail分別查看文件開頭、結尾的行信息。對于特定想要顯示的信息則需要特定的文本查看指令,比如cut,sort,paste,uniq等。如下內容分別對每個命令進行分別總結。


    1.more與less,head與tail

    more與less作用等同于cat文本查看命令,more命令默認按頁面展示文件內容,常用-d選項顯示翻頁與退出提示。more命令顯示文本界面只支持向后翻頁而不支持向前翻頁。less命令可查看文件與stdin輸出,前后皆可翻頁。

    head命令常用選項為-c與-n,-c顯示文件前#個字節,-n顯示文件前#行內容。tail命令與之相反,同樣使用-c,-n選項,不同的是顯示的是后#字節與后#行內容。對于如/etc/passwd這樣的配置文件,如果要實現跟蹤顯示新追加內容,常常使用tail -f選項。此選項常用于log日志監控。


    2.cut與paste

    cut字面意思為剪切,用于選取文件特定縱列的內容。常常使用-c(按字符),-b(按字節)選取縱列。但在實際應用中,人很難按字符與字節詳細查詢指定縱列,所以這里詳細講解-d的使用方式如下:

[root@localhost ~]# cut -d: -f1,3 /etc/passwd
root:0
bin:1
daemon:2
adm:3
lp:4

    上述命令-d:定義“:”為分隔符將文件分為若干縱列,-f1,3表示選取-d:定義的第1,3列。/etc/passwd以“:”分割內容的第1,3列內容為用戶名稱與UID號碼,輸出命令即為上面輸出形式。

    在/etc/passwd這種內容格式固定的文件可以使用如同“:”作為分隔符。但如果文本內容不是固定格式,如果想要得到固定列內容,則需要自定義分隔符,可多次如下:

[root@localhost testdir]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.1.252.255  netmask 255.255.0.0  broadcast 10.1.255.255
        inet6 fe80::20c:29ff:fe61:2a16  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:61:2a:16  txqueuelen 1000  (Ethernet)
        RX packets 116344  bytes 11590351 (11.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4379  bytes 489447 (477.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 6  bytes 504 (504.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6  bytes 504 (504.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:21:74:43  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

如果想通過cut命令只顯示ip地址,則可以按照如下方式獲得:

[root@localhost testdir]# ifconfig|tr -s ' '|grep 255|cut -d" " -f3
10.1.252.255
127.0.0.1
192.168.122.1

    由于ifconfig得到的信息排布凌亂,先使tr命令刪除連續重復的空格字符,這樣便于在隨后的cut命令中使用空格作為分隔符選取縱列。

    paste命令用于合并兩文件同行號內容排到一行并且使用分隔符隔開,-d選項定義兩文件內容同行分隔符,舉例如下:

[root@localhost testdir]# cat f1
xxx
xx
x
[root@localhost testdir]# cat f2

yyy
yy
y
[root@localhost testdir]# paste -d~ f1 f2
xxx~
xx~yyy
x~yy
~y


    3.wc與sort

    wc是分析文本數據的指令,也可以分析指定字符串。例如:

[root@localhost testdir]# wc /testdir/xiaojiji 
  52   96 2664 /testdir/xiaojiji

    這里52代表xiaojiji文件行數,96代表單詞數,2664代表文件字符數。如果wc命令使用選項,有4種常用選項,其分別為:

    -l:只計數文本內容行數

    -w:只計數文本內容單詞總數

    -c:只計數文本內容字節總數

    -m:只計數文本內容字符總數

    sort命令用于整理文本內容,以特殊排列的方式展示縱向文本,常常與cut一起使用。其命令選項為:

    -r:反向整理

    -n:按數字大小整理(由小到大

    -f:忽略字符大小寫

    -u:刪除輸出中的重復行

    與cut命令一樣,對于縱列的整理需要分隔符分割后定義列號,這時需要-t,-k的配合使用:

    示例:按照UID大小順序排列/etc/passwd文件內容

[root@localhost ~]# sort -nt: -k3 /etc/passwd
...........
........
wangcai:x:1102:3001::/testdir/homewangcai:/bin/bash
alice:x:1103:3004::/home/alice:/bin/bash
tom:x:1104:3005::/home/tom:/bin/bash
bash:x:1105:1105::/home/bash:/bin/bash
testbash:x:1106:1106::/home/testbash:/bin/bash
nologin:x:1107:1107::/home/nologin:nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

    由此得到輸出結果為UID從小到大的排列。

    

    4.uniq與diff

    uniq命令:從輸入中刪除重復內容的連續行,常常通過管道和sort整理后的結果使用。diff命令:對比兩個文件內容,由于使用較少,這里不做詳細介紹。


  二.grep以及正則表達式

    對于文本中特定字符或字符段的顯示,無論是cat,cut,tail等命令都是難以做到的,這時就要使用grep文本搜索工具。grep命令常用于顯示用戶所需要的固定字段內容,對于范圍內的固定字段,需要根據規定的正則表達式來體現。

    1.grep常用選項

    -v:顯示沒有被匹配的行,也就是取反

    -i:忽略匹配字符字母大小寫

    -n:顯示匹配字段行號

    -o:僅顯示匹配到的字符

    -q:靜默模式,不輸出任何信息

    -A#:匹配字符與后#行

    -B#:匹配字符與前#行

    -C#:匹配字符與前后#行

    -w:匹配整個單詞

    –color=auto:匹配字符上色


    2.正則表達式與擴展正則表達式

    正則表達式BRE的存在為grep查找范圍字符段提供了方便靈活的使用手段。這里我把其分為四類用途如下:

    a.匹配單個字符表達方式

    .:匹配任意單個字符

    []:匹配任意[]范圍內的單個字符,比如[1-9]代表匹配1-9以內的任意一個數字

    [^]:匹配任意非[]內的單個字符

    其他代表任意單個字符的正則表達式與之前講到的通配符glob相似:[:digit:]任意單個數字,[:lower:]任意單個小寫字母,[:upper:]任意單個大寫字母,[:alpha:]任意單個字母,[:alnum:]任意單個數字或字母,[:space:]任意單個空白字符或tab字符,[:punct:]任意單個標點符號

    b.字符的匹配次數

    *:匹配前面字符的次數,比如.*代表匹配任意長度的任意字符

    \+:\表示轉譯符號,\+代表匹配前面字符0次或1次(\轉譯符在grep中很常見)

    \(m\):匹配前面字符m次

    \(m,n\):匹配前面字符最少m次,最多n次

    \(m,\):匹配前面字符至少m次

    \(,n\):匹配前面字符最多n次

    c.位置錨定

    ^:指定行首,比如^w表示匹配以w為開始的字符串

    $:指定行尾,w$表示匹配以w結尾的字符串

    ^$:匹配空行(行首行尾無字符)

    ^pattern$:匹配整行固定內容

    \<pattern\>:單詞匹配模式,比如如果文本內容有mcgee,wangmcgee,我們僅僅想找尋mcgee,需要使用grep \<mcgee\>來查找,這里可以使用grep -w mcgee代替,但是如果查找范圍內的單詞,則必須使用\<pattern\>的用法了,這里\<pattern\>也可以使用\bpattern\b代替,但由于\b容易與單詞混淆,個人不建議使用。

    d.分組與變量

    \(\):表示將()內的內容分組并記錄在變量中,\仍然代表轉譯符。變量表示方式為\1,\2,\3….,這里\1表示第一個“\(”與其匹配的“\)”之間的內容,\2表示第二對,以此類推…。下面使用實例說明這四類用途:

    找出/etc/passwd文件中用戶名與shell名稱相同的行并顯示

[root@localhost ~]# grep "^\(\<[[:alpha:]]\+\>\).*\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:1105:1105::/home/bash:/bin/bash
nologin:x:1107:1107::/home/nologin:nologin

   這里使用了匹配字符表達方式,匹配字符次數,位置錨定,分組的所有用法,注意轉譯符號“\”的存在,如果理解上述abcd的用法,此例不難理解。


    2.擴展正則表達式

    擴展正則表達式ERE由egrep命令使用,egrep=grep -E。ERE區別于BRE即為匹配字符時“\”轉譯符的不使用,舉例如下:

    查詢/etc/passwd文件中UID或GID超過3位數的用戶行:

[root@localhost ~]# grep -E "[0-9]{3,}" /etc/passwd
....
...
geoclue:x:994:991:User for geoclue:/var/lib/geoclue:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
chrony:x:993:990::/var/lib/chrony:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
saslauth:x:991:76:Saslauthd user:/run/saslauthd:/sbin/nologin
libstoragemgmt:x:990:988:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
mcgee:x:1000:1000:mcgeewang:/home/mcgeewang:/bin/bash
docker:x:1002:1002::/home/docker:/bin/bash
natasha:x:0:1004::/home/natasha:/bin/bash
harry:x:1004:1005::/home/harry:/bin/bash
gentoo:x:1005:1006::/testdir/gentoo:/bin/bash
user1:x:1100:1102:dafeige:/home:/bin/bash
user2:x:1101:1101:dafeige:/home:/bin/bash
wangcai:x:1102:3001::/testdir/homewangcai:/bin/bash
alice:x:1103:3004::/home/alice:/bin/bash
tom:x:1104:3005::/home/tom:/bin/bash
bash:x:1105:1105::/home/bash:/bin/bash
testbash:x:1106:1106::/home/testbash:/bin/bash
nologin:x:1107:1107::/home/nologin:nologin

   如上所示,得到三位數UID或GID的用戶行信息。

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

(0)
mcgeewangmcgeewang
上一篇 2016-08-08
下一篇 2016-08-08

相關推薦

  • linux文件管理

    目錄創建刪除,軟硬鏈接的區別和注意,file命令的使用,工作中遇到一些情況的處理方法

    2017-11-18
  • Linux任務計劃

    Linux任務計劃主要分為分為兩種分別是一次性任務計劃和周期性任務計劃實現工具主要是at和crontab下面將詳細介紹任務計劃工具的使用。 1、at命令一次性任務計劃 at命令是由atd服務提供的其主程序包是atd在CentOS6上可以使用service atd start命令來啟動在CentOS7上需要使用systemctl start atd.servi…

    Linux干貨 2016-09-11
  • Homework Week-10 CentOS啟動相關及bash腳本編程

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) 2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;   (1) 為硬盤新建兩個主分區;并為其安裝grub;   (2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;   (3) 為rootfs提供…

    Linux干貨 2016-10-24
  • HA Cluste 的配置:keepalived:vrrp協議 雙主模型

    keepalived:vrrp協議 雙主模型 第一步配置出始環境: 準備兩節點: 主節點:172.18.57.7 long1 備節點:172.18.57.8 long2 (1) 各節點時間必須同步; 同步時間: ~]# yum -y install chrony ~]# vim /etc/chrony.conf ~]# systemctl start chr…

    Linux干貨 2017-05-15
  • 虛擬化技術介紹、Xen的簡單實現

    虛擬化是什么? 虛擬化是一種資源管理技術, 是將計算機的各實體資源, 如服務、網絡、內存及存儲等, 予以抽象、轉換后呈現出來, 打破實體之間的不可切割的障礙, 使用戶可以比原本的配置更好的方式來應用這些資源。這些資源的新虛擬部分是不受現有資源的架設方式, 地域或物理配置所限制。一般情況下, 虛擬化資源包括計算能力和數據存儲 —<轉自維基百科&…

    2016-05-31
  • Linux Basics-重定向與管道:第一部分

    Linux Basics-重定向與管道:第一部分 概述 本教程將介紹 Linux 中重定向標準 IO 流的基本技術。學習: 什么是重定向與標準 IO 流:標準輸入、標準輸出和標準錯誤 各種流和管道的實際應用   前提條件 你應該了解 Linux 基本知識以及擁有一個正常工作的 Linux 系統,在本文說明的實例中,我采用是CentOS 7 內核版本…

    Linux干貨 2016-10-29
欧美性久久久久