linux过滤脚本中的字段,Shell脚本中常用的文本过滤命令
在Linux運維日常工作中,Shell腳本的使用如家常便飯一樣,須做到順手拈來,文本處理所占比重更是不容小視,而文本處理中,稍具難度的莫過于文本的過濾。今天我們要通過這一講,掌握文本過濾的常用命令,有哪些呢?具體如下:
1)head
作用:提取文本文件的前幾行
格式:head? -數字? 文本文件
實例:
--查看/etc/passwd/文件的前3行
#head? -3? /etc/passwd
2)tail
作用:提取文本文件的末尾幾行
格式:tail +數字/-數字/-f?? 文本文件
實例:
--查看/etc/passwd文件中的最后5行
#tail? -5? /etc/passwd
--查看/etc/passwd文件的第10行到最后一行的內容
#tail? +10? /etc/passwd
--監視/vas/log/messages文件是否追加了內容
#tail? -f? /var/log/messages
3)grep
作用:在文本文件中提取匹配的行
格式:grep? [參數] "字符串/正則表達式"? 文本文件
參數:
-c 只顯示匹配的行的個數,不顯示行的內容
-q 只顯示查找狀態,不顯示行的內容
-v 查找不匹配的行
-n 在顯示行前標上在文檔中的行號
-w 完全匹配
-i 模式匹配時忽略大小寫
正則表達式元字符:
^
錨定行的開始 如:'^grep'匹配所有以grep開頭的行
$
錨定行的結束 如:'grep$'匹配所有以grep結尾的行
.
匹配一個非換行符的字符 如:'gr.p'匹配gr后接一個任意字符,然后是p
*
匹配零個或多個先前字符 如:' *grep'匹配所有一個或多個空格后緊跟grep的行。
.*一起用代表任意字符
[...]
匹配一個指定范圍內的字符,如'[Gg]rep'匹配Grep和grep
[^...]
匹配一個不在指定范圍內的字符
\(..\)
標記匹配字符,如'\(love\)',love被標記為1
\<
錨定單詞的開始,如:'\
\>
錨定單詞的結束,如:'grep\>'匹配包含以grep結尾的單詞的行
x\{m\}
重復字符x,m次,如:'0\{5\}'匹配包含5個0的行
x\{m,\}
重復字符x,至少m次,如:'o\{5,\}'匹配至少有5個o的行
x\{m,n\}
重復字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5-10個o的行
實例:
--在/etc/passwd文件中查找包含字符串root的行并顯示
#grep? "root"? /etc/passwd
--在/etc/passwd文件中查找以a/b/d開頭的行并顯示行內容
#grep? "^[abd]"? /etc/passwd
--統計/etc下以d開頭的行數
#ls -l /etc | grep -c "^d"
4)sort
作用:對文本文件進行排序并輸出
格式:sort [參數]? 文件路徑
-f 忽略大小寫
-t 指定字段分隔符
-r????? 降序排列
-n????? 按數字大小排列
-u 消除重復行
實例:
--輸出/etc/passwd文件內容并排序
#sort? /etc/passwd
--對/etc/passwd文件按第三字段排序,以:號字段分隔符,并以數字升序排列
--sort? -t: -n? +2 -3? /etc/passwd
5)uniq
作用:去除文本文件中重復內容并輸出
格式:uniq? [參數]? 文本路徑
-u 輸出未重復的內容
-d 輸出重復的內容
實例:
--顯示/abc/a1文件內容,去除重復,重復的行只顯示一行
#uniq? /abc/a1
--顯示/abc/a1的未重復內容,重復的行全都不顯示
#uniq? -u? /abc/a1
--只顯示/abc/a1的重復內容,重復的行只顯示一行
#uniq -d? /abc/a1
注:經常結合sort與uniq
如:#sort? /abc/a1 | uniq
6)sed
作用:Sed(a stream editor)是一種流線型、非交互式編輯器。用可利用命令來編輯文件內容并輸出
格式:sed? [參數] '子命令'? 文件路徑
-n 關閉默認顯示
-e 多次編輯
子命令:
-p 顯示匹配的行
-a 在指定行的后面添加新行
-i 在指定行的前面添加新行
-d 刪除匹配的行
-s 修改匹配的行
-r 將指定文件的內容讀到當前文件匹配的行的下面
-w 將匹配的內容寫到指定的文件中
-y 傳送字符,變換字符
-n 讀取下一行
-{...} 對匹配的行執行命令組
-q 退出sed
-b 標記 //跳到標記位置
-t 標記 //如果某行發生修改,則跳到指定位置
-T 標記 //如果某行未發生修改,則跳轉到指定位置
實例:
-->打印命令:p
--顯示/etc/passwd下包含root的行
#sed? -n? '/root/p' /etc/passwd
--顯示/etc/passwd下2到15的行
#sed? -n? '2,15p'? /etc/passwd
--顯示/etc/passwd下2到末尾的行
#sed? -n? '2,$p'? /etc/passwd
-->刪除命令:d
--刪除/etc/passwd下以u1開頭的行,其余行輸出到屏幕
#sed? '/^u1/d' /etc/passwd
--刪除/etc/passwd中的第9行,其余行輸出到屏幕
#sed? '9d' /etc/passwd
--刪除/etc/passwd下含有u1的行,其余行輸出到屏幕
#sed? '/u1/d'? /etc/passwd
-->修改命令:s
--將/etc/passwd中所有的root修改為admin,并輸出
#sed? 's/root/admin/g'? /etc/passwd
--將/etc/passwd中第一行到第五行的root修改為admin,并輸出
#sed? '1,5s/root/admin/g' /etc/passwd
-->在指定行的后面添加新行:a
--在/etc/passwd中第3行下面插入一行“linux system”
#sed? '3a \linux system' /etc/passwd
-->在指定行的前面添加新行:i
-在/etc/passwd中第3行前面插入一行“linux system”
#sed? '3i \linux system' /etc/passwd
-->將指定文件的內容讀到當前文件匹配的行的下面:r
--將/abc/a1的內容讀到/abc/a2第5行的下面
#sed? '5r /abc/a1'? /abc/a2
-->將匹配的內容寫到指定的文件中:w
--將/etc/passwd下包含root的行寫到/abc/root.txt中
#sed? -n? '/root/w? /abc/root.txt' /etc/passwd
-->傳送字符,變換字符:y
--將/abc/a1第2行到第5行的a變為大寫A
#sed? '2,5y/a/A/' /abc/a1
-->退出:q
--在打印了5行之后,用q命令退出sed程序。
#sed '5q'? /etc/passwd
8)tr
作用:替換或刪除文件中的指定字符
格式:tr [參數] 字符串1? 字符串2? 文件路徑
-c 替換字符
-d 刪除字符
-s 替換字符串1?? 字符串2
字符范圍:
[A-Z]
[a-z]
[0-9]
[0*n]??? //表示字符0重復出現指定次數n
如:[0*2]匹配00的字符串
\octal
控制字符:
\a 鈴聲
\b 退格符
\n 新行
\r 回車
\t tab鍵
通配字符:
[:alnum:] 所有字母和數字
[:alpha:] 所有字母
[:lower:] 所有小寫字母
[:upper:] 所有大寫字母
[:digit:] 所有數字
[:blank:] 所有空行
[:space:] 所有空格
[:graph:] 所有可顯示的字符,不包含空格
[:print:] 所有可顯示的字符,包括空格
[:cntrl:] 所有控制字符
[:punct:] 所有標點符號字符
[:xdigit:] 所有十六進制數字
實例:
--去除/abc/a1中的換行符
#tr -d? '\n\r' < /abc/a1
--修改/abc/a1中所有abc為123
#tr 'abc' '123' < /abc/a1
--修改/abc/a1中所有小寫字母為大寫字母
#tr [:lower:] [:upper:] < /abc/a1
總結
以上是生活随笔為你收集整理的linux过滤脚本中的字段,Shell脚本中常用的文本过滤命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win8 查看 linux硬盘大小,如何
- 下一篇: linux on android分区,l