Linux文本處理三劍客 grep:文本過濾(模式:pattern)工具 grep, egrep, fgrep(不支持正則表達式搜索) sed:stream editor,文本編輯工具 awk:Linux上的實現gawk,文本報告生成器 cat: 文件查看命令: -E: 顯示行結束符$ -n: 對顯 ...
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:在指定行後面追加文本 支持使用\n實現多行追加 i [\]text:在行前面插入文本 c [\]text:替換行為單行或多行文本 w /path/somefile: 保存模式匹配的行至指定文件 r /path/somefile:讀取指定文件的文本至模式空間中 匹配到的行後 =: 為模式空間中的行列印行號 !:模式空間中匹配行取反處理 替換 s///:查找替換,支持使用其它分隔符,s@@@,s### 替換標記: g: 行內全局替換 p: 顯示替換成功的行 w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中 高級編輯命令 P:列印模式空間開端至\n內容,並追加到預設輸出之前 h: 把模式空間中的內容覆蓋至保持空間中 H:把模式空間中的內容追加至保持空間中 g: 從保持空間取出數據覆蓋至模式空間 G:從保持空間取出內容追加至模式空間 x: 把模式空間中的內容與保持空間中的內容進行互換 n: 讀取匹配到的行的下一行覆蓋至模式空間 N:讀取匹配到的行的下一行追加至模式空間 d: 刪除模式空間中的行 D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本, 並不會讀取新的輸入行,而使用合成的模式空間重新啟動迴圈。如果模式空間 不包含換行符,則會像發出d命令那樣啟動正常的新迴圈 實例: seq 1 5 |sed 2d ifconfig |sed -n '2p' cat pets |sed "2a\hello\n123" cat pets |sed "2ihello\n123" cat pets |sed "2chello\n123" 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/(.*)/magedu\1/' /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/(.*)/magedu\1/' /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/a\superman’ /etc/passwd行後 sed ‘/root/i\superman’ /etc/passwd 行前 sed ‘/root/c\superman’ /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 去除文件中的空白行 \< 或 \b 詞首錨定,用於單詞模式的左側 \> 或 \b 詞尾錨定;用於單詞模式的右側 \<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 字元匹配: .任意單個字元