1.文件查看相關命令
(1)cat命令
cat [OPTION]… [FILE]…
-E:顯示行結束符
-n:對顯示除的每一行進行編號
-A:顯示所有控制符
-b:僅對非空行編號
-s:壓縮連續的空行成一行
(2)tac命令
倒序顯示文件內容
(3)rev命令
rev f2反向顯示文件的每一行內容
(4)more命令
分頁查看文件
more [OPTION…] FILE…
-d:顯示翻頁及退出提示
!COMMAND,執行完接著看文檔
支持查找等,但是僅能向下查找
(5)less:一頁頁地查看文件或STDIN輸出
查看時有用的命令包括:
/文本 搜索文本
n/N 跳到下一個或上一個匹配項
man命令中使用的分頁器也是less
2.顯示文本前或后行內容
(1)head命令
head [OPTION]… [FILE]…
-c #:指定獲取前#字節
-n #:指定獲取前#行
-# :指定行數
(2)tail命令
tail [OPTION]… [FILE]…
-c #:指定獲取后#行
-n #:指定獲取后#行
-# :指定獲取后#行
-f:跟蹤顯示文件新追加內容,常用于日志監控
logger "this is a log test" :命令logger是觸發產生日志的命令
tail -n 0 -f /var/log/messages & 可邊工作邊動態顯示日志變化情況
3.文本抽取和合并命令
(1)cut [OPTION]… [FILE]…
-d DELIMITER:指明分隔符,默認tab
-f FILED:
#:第#個字段
#,#[#]:離散的多個字段,如:1,3,6
#-#:連續的多個字段,例如:1-5
混合使用:1-3,7
-c 按字符切割
–output-delimiter=STRING指定輸出分隔符
ifconfig中取
ip:head -2 f2|tail -1 |cut -d ':' -f 2|cut -d ' ' -f 1
CentOS7:ifconfig|head -2|tail -1|cut -d' ' -f 10
取df中磁盤的使用率
df |tr -s ' '|cut -d ' ' -f5|tr -d '%'
df |tr -s ' '|tr ' ' ':'|cut -d':' -f5|tr -d "%"
顯示文件或STDIN數據的指定列
cut -d: -f1 /etc/passwd
cat /etc/passwd |cut -d: -f7
cut -c2-5 /usr/share/dict/words
(2)paste文本合并命令
paste [OPTION]… [FILE]…
-d 分隔符:指定分隔符,默認用tab
-s:所有行合并成一行
paste f1 f2
paste -s f1 f2
4.分析文本的工具
(1)搜集文本統計數據wc
直接執行wc會顯示文件的行數,字符數,單詞數
wc -l:顯示文件行數
wc -w:顯示文件的單詞數
wc -c:顯示文件的字節數
wc -m:統計字符
(2)文本排序sort
把整理過的文本顯示在STDOUT,不改變原始文件
sort f2默認排序
cat f1 |sort -n -t:-k3
-n純數字排序
-r倒序排序
-t指定分隔符
-k指定排序位置
-u刪除重復行
(3)uniq命令
從輸入中刪除重復的前后相接的行
uniq [OPTION]… [FILE]…
-c:顯示每行重復的次數
-d:僅顯示重復過的行
-u:僅顯示不重復的行
在uniq中把連續且完全相同的才認為是重復
常和sort命令一起配合使用:
sort userlist.txt |uniq -c
(4)diff比較文件
比較兩個文件之間的區別
diff f1 f2
diff 命令的輸出被保存在一種叫做‘補丁’的文件中
使用-u選項來輸出‘統一的’diff格式文件,最適用于補丁文件。
patch命令復制在其它文件中進行的改變(要謹慎使用)
適用-b選項來自動備份改變了的文件
diff -u f1 f2 > f.patch
patch -b f1 f.patch
(5)練習:
1、找出ifconfig命令結果中本機的所有IPv4地址
ifconfig|tr -cs '[0-9].' '\n'|sort -ut '.' -k3
? 2、查出分區空間使用率的最大百分比值
df |tr -s ' '|tr ' ' ':'|cut -d':' -f5|tr -d "%"|sort -n |tail -1
? 3、查出用戶UID最大值的用戶名、UID及shell類型
cat /etc/passwd|sort -n -t: -k3|tail -1|cut -d: -f1,3,7|tr ':' '\n'
? 4、查出/tmp的權限,以數字方式顯示
stat /tmp|head -4|tail -1|cut -d'(' -f2|cut -d'/' -f1
? 5、統計當前連接本機的每個遠程主機IP的連接數,并按從大到小排序
netstat -nt|tr -s ' '|cut -d' ' -f5|sort|uniq -c|cut -d' ' -f 7|sort -n
5.grep文本過濾命令
(1)grep:Global search REgular expression and Print out the line
作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查,打印匹配到的行;
模式:由正則表達式字符及文本字符所編寫的過濾條件
(2)grep [OPTIONS] PATTERN [FILE…]
grep root /etc/passwd
grep "$USER" /etc/passwd
grep '$USER' /etc/passwd 這個強引用會使$符號無效
grep `whoami` /etc/passwd
(3)grep命令選項
–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:使用擴展表達式
grep -E=egrep
6.正則表達式
(1)REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能。
程序支持:grep,vim,less,nginx等
分類:
基本正則表達式:BRE
擴展正則表達式:ERE
grep -E ,egrep
正則表達式引擎:
采用不同算法,檢查處理正則表達式的軟件模塊
元字符分類:字符匹配、匹配次數、位置錨定、分組
獲得更多關于正則表達式的信息:man 7 regex
(2)基本正則表達式元字符
字符匹配:
.:匹配任意單個字符
[]:匹配指定范圍內的任意單個字符
[^]:匹配指定范圍外的任意單個字符
[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
匹配次數:
用在要指定次數的字符后面,用于指定前面的字符出現的次數
*:匹配前面的字符任意次,包括0次
貪婪模式:盡可能長的匹配
.*:任意長度的任意字符
\?:匹配其前面的字符0或1次
\+:匹配其前面的字符至少1次
\{n\}:匹配前面的字符N次
\{m,n\}:匹配前面的字符至少m次,至多n次
\{,n\}:匹配前面的字符至多n次
\{n,\}:匹配前面的字符至少n次
位置錨定
定位出現的位置
^:行首錨定,用于模式的最左側
$:行尾錨定,用于模式的最右側
^PATTERN$:用于模式匹配整行
^$:空行
^[[:space:]]*$:空白行
\<或\b:詞首錨定,用于單詞模式的左側
\>或\b:詞尾錨定;用于單詞模式的右側
\<PATTERN\>:匹配整個單詞
分組:
\(\):將一個或多個字符捆綁在一起,當做一個整體進行處理,如:\(root\)\+
分組括號中的模式匹配到的內容會被正則表達式的引擎記錄于內部的變量中,這些變量的命名方式為
:\1,\2,\3,…
\1:從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符
\(string\+\(string\)*\)
\1:string\+\(string2\)*
\2:string2
后向引用:引用前面的分組括號中的模式所匹配字符(而非模式本身)
示例:~]# grep "^\(.*\b\).*\/\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
相關練習:
1、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式)
~]# cat /proc/meminfo | grep -i '^S' SwapCached: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Shmem: 240 kB Slab: 64448 kB SReclaimable: 38424 kB SUnreclaim: 26024 kB ~]# cat /proc/meminfo | grep -e '^s' -e '^S' SwapCached: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Shmem: 240 kB Slab: 64448 kB SReclaimable: 38424 kB SUnreclaim: 26024 kB
? 2、顯示/etc/passwd文件中不以/bin/bash結尾的行
~]# cat /etc/passwd |grep -v '/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 sync:x:5:0:sync:/sbin:/bin/sync
? 3、顯示用戶rpc默認的shell程序
~]# cat /etc/passwd|grep '\brpc\b' |cut -d : -f 7 /sbin/nologin
? 4、找出/etc/passwd中的兩位或三位數
~]# cat /etc/passwd|grep '\b[[0-9][0-9][0-9]\?\b' mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin ~]# cat /etc/passwd|grep '\b[[0-9]\{2,3\}\b' mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
? 5、顯示/etc/grub2.cfg文件中,至少以一個空白字符開頭的且后面存非空白字符的行
~]# cat /etc/grub2.cfg |grep '^[[:space:]]\+[^[:space:]]' load_env set default="${next_entry}" set next_entry=
? 6、找出“netstat -tan”命令的結果中以‘LISTEN’后跟任意多個空白字符結尾的行
~]# netstat -tan|grep 'LISTEN[[:space:]]*' tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:631 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN tcp6 0 0 ::1:6010 :::* LISTEN [root@centos7 ~]#
7、添加用戶bash、testbash、basher以及nologin(其shell為/sbin/nologin),而后找出/etc/passwd文件中用戶名同shell名的行
~]# cat /etc/passwd|grep "^\(.*\b\).*/\1$" 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:1003:1005::/home/bash:/bin/bash nologin:x:1006:1008::/home/nologin:/sbin/nologin ~]# cat /etc/passwd|grep -E '^(.*):.*/\1$' 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:1003:1005::/home/bash:/bin/bash nologin:x:1006:1008::/home/nologin:/sbin/nologin
7.egrep及擴展的正則表達式
egrep=grep -E
egrep [OPTIONS] PATERN [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
練習題:
1、顯示三個用戶root、mage、wang的UID和默認shell
~]# cat /etc/passwd|grep -E "^(root|mage|wang)"|cut -d: -f3,7 0:/bin/bash 1000:/bin/bash 1009:/bin/bash
? 2、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟一個小括號的行
~]# cat /etc/rc.d/init.d/functions |grep -E '^([[[:alpha:]]+|_])\(\)' checkpid() { daemon() { killproc() { pidfileofproc() { pidofproc() { status() { success() { failure() { passed() { warning() { action() { strstr() {
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
~]# echo "/etc/rc.d/init.d/functions" | egrep -o '[^/]+/?$' functions
4、使用egrep取出上面路徑的目錄名
~]# echo "/etc/rc.d/init.d/functions" | egrep -o '/.*/' /etc/rc.d/init.d/
5、統計以root身份登錄的每個遠程主機IP地址的登錄次數
~]# who |grep "^root"|egrep -o "\(.*\)"|cut -d ')' -f1|cut -d'(' -f2|sort|uniq -c 2 10.1.250.58
6、利用擴展正則表達式分別表示0-9、10-99、100-199、200-249、250-255
0-9:[0-9]; 10-99:[1-9][0-9] ; 100-199:1[0-9]{2};200-249:2[0-4][0-9];250-255:25[0-5]
7、顯示ifconfig命令結果中所有IPv4地址
~]# ifconfig|egrep -o '(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])' 10.1.249.36 10.1.255.255 255.255.0.0 127.0.0.1 255.0.0.0
8.sed文本處理工具
Stream EDitor,行編輯器
sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為
“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著
處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出
sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等
用法:
sed [option]… 'script' inputfile…
常用選項:
-n:不輸出模式空間內的自動打印
-e:多點編輯
-f:/path/to/script_file:從指定文件中讀取編輯腳本(文件中寫的是2p打印第二行)
-r:支持使用擴展正則表達式
-i:原處編輯(會真正改變源文件)sed -i.bak '2d' f1 刪除的時候先備份
script:
‘地址命令’
地址定界:
(1)不給地址:對全文進行處理
(2)單地址:
#:指定的行
/pattern/:被此模式所能夠匹配到的每一行
(3)地址范圍
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4)~:步進
1~2 奇數行
2~2 偶數行
編輯命令:
d:刪除模式空間匹配到的行
p:顯示模式空間中的內容
a \text:在行后面的下一行中追加文本;支持使用\n實現多行追加
i \text:在行前面插入文本;支持使用\n實現多行插入
c \text:替換行為單行或多行文本
w /path/to/somefile:保存模式匹配的行至指定文件
r /path/from/somefile:讀取指定文件的文本至模式空間中匹配到的行后
=:為模式空間中的行打印行號
?。耗J娇臻g中匹配行取反處理
s///:查找替換,支持使用其它分隔符號:s@@@,s###
替換標記:
g:行內全局替換
p:顯示替換成功的行
w /path/to/somefile:將替換成功的行保存至文件中
sed命令相關示例:
(1)
~]# sed '2p' /etc/passwd #打印第二行,由于sed本身處理會打印,故第二行打印兩次 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
(2)
~]# sed -n '2p' /etc/passwd #-n僅顯示匹配到的行,即第二行 bin:x:1:1:bin:/bin:/sbin/nologin
(3)
~]# sed -n '1,4p' /etc/passwd #打印1到第四行 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
(4)
~]# sed -n '/root/p' /etc/passwd #打印行中帶root的行 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
(5)
~]# sed -n '2,/root/p' /etc/passwd #打印第二行向后到行中帶root的行 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 sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
(6)
~]# sed -n '/^$/=' /etc/fstab #顯示空行的行號 1
(7)
~]# sed -n -e '/^$/p' -e '/^$/=' /etc/fstab #一次執行多個操作,用-e分別區分每個操作 1
(8)
~]# sed '/root/a\superman' /etc/passwd #在匹配到的行的下方追加內容 root:x:0:0:root:/root:/bin/bash superman
(9)
~]# sed '/root/i\superman' /etc/passwd #在匹配行的上一行添加 superman root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
(10)
~]# sed '/root/c\superman' /etc/passwd #替換匹配到的行中的內容 superman bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
練習題:
1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符
~]# cat /etc/grub2.cfg |sed 's/^[[:space:]]\+//'
2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
~]# cat /etc/fstab |sed -r 's@^#[[:space:]]+@@'
3、在/root/install.log每一行行首增加#號
~]# cat /root/install.log|sed 's@^@#@'
4、在/etc/fstab文件中不以#開頭的行的行首增加#號
~]# cat /etc/fstab |sed "s@^[^#]@#&@"
5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
取目錄名:
~]# echo "/etc/" |sed -r "s@(.*/)[[:alnum:]]+/?@\1@"
取基名:
~]# echo "/etc/" |sed -r "s@.*/([[:alnum:]]+/?)@\1@"
? 6、利用sed 取出ifconfig命令中本機的IPv4地址
~]# ifconfig |sed -n '/Bcast/p'|sed -r 's/.*:(.*) B.*/\1/' 10.1.249.36
? 7、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重復次數
Packages]# ls | sed -r 's/.*\.([^\.]+)\.rpm/\1/'|sort|uniq -c 1 _1 1 1asfh 1561 i686 1448 noarch 1 TRANS.TBL 3687 x86_64
sed的高級編輯命令:
h:把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g:從保持空間取出數據覆蓋至模式空間
G:從保持空間中取出內容追加到模式空間中
x:把模式空間中的內容與保持空間中的內容進行互換
n:讀取匹配到的行的下一行覆蓋至模式空間
N:追加匹配到的行的下一行至模式空間
d:刪除模式空間中的行
D:刪除當前模式空間開端至\n的內容(不再傳至標準輸出),放棄之后的命令,但是對
剩余模式空間重新執行sed
sed高級編輯的示例
sed -n 'n;p' FILE #顯示偶數行,讀第一行后把第二行讀入把1覆蓋,此時僅剩2,依次類推
? sed '1!G;h;$!d' FILE #倒序排列
sed '$!N;$!D' FILE #僅顯示最后兩行
? sed '$!d' FILE #顯示最后一行
? sed ‘G’ FILE #每行后面加一行空格
? sed ‘g’ FILE #把文件中的每行替換為空行
? sed ‘/^$/d;G’ FILE #每行后面加一行空格
? sed 'n;d' FILE #顯示奇數行
? sed -n '1!G;h;$p' FILE #倒序顯示
原創文章,作者:提著醬油瓶打醋,如若轉載,請注明出處:http://www.www58058.com/32335