shell中截取字元串的方法有很多中,本人對其中幾種常用的進行整理總結。
0x01、grep
在檔案中搜尋字元串比對的行并輸出
Linux系統中grep指令是一種強大的文本搜尋工具,它能使用正規表達式搜尋文本,并把匹 配的行列印出來。grep全稱是Global Regular Expression Print,表示全局正規表達式版本,它的使用權限是所有使用者。
grep 【選項】【指定字串】【檔案】
-i 不區分大小寫
-v 排除指定字串
-c:隻輸出比對行的計數。
-n:顯示比對行及 行号。
-s:不顯示不存在或無比對文本的錯誤資訊。
grep支援正規表達式,下面總結下正規表達式和通配符。
正規表達式
正規表達式用來在檔案中比對符合條件的字元串,正規表達式是包含比對。grep、awk、sed等指令可以支援正規表達式。
通配符
通配符用來比對符合條件的檔案名,通配符是完全比對,ls、find、cp這些指令不支援正規表達式,是以隻能使用shell自己的通配符來進行比對。
正則有些符号和通配符有些符号通用,但含義完全不同
基礎正規表達式
元字元
作用
*
前一個字元比對0次或任意多次
.
比對除了換行符外任意一個字元
^
比對行首。如^hello會比對以hello開頭的行
$
比對行尾,如hello會比對以hello結束的行
[]
比對中括号中任意的一個字元,隻比對一個字元。
[^]
比對除中括号的字元以外的任意一個字元。如[^0-9]比對任意一個非數字字元
\
轉義符。用于取消特殊符号的含義
{n}
n是一個非負數,比對前面的字元恰好出現n次。如o{2}比對food中的兩個o
{n,}
表示其前面的字元出現不少于n次
{n,m}
最少比對n次且最多比對m次
<code>需要注意的是,通配符的*表示任意字元,而正規表達式的*是比對錢一個字元0次或者任意多次</code>
<code>grep </code><code>"s*"</code> <code>anaconda-ks.cfg 顯示的不是包含有s的行,而是顯示了整個檔案,“s*”比對s的0次或多次</code>
<a href="http://s5.51cto.com/wyfs02/M00/88/84/wKiom1f6RdaT3X6gAABh-OoO3zM168.png" target="_blank"></a>
<code>grep </code><code>"size*"</code> <code>anaconda-ks.cfg比對了e的0次或多次,但至少需比對siz字元串</code>
<a href="http://s5.51cto.com/wyfs02/M01/88/81/wKioL1f6RfKiEwFnAAAP-3uht8c349.png" target="_blank"></a>
<code>“.”比對除了換行符外任意一個字元,和通配符的?相同,“.*”就才和通配符中的“*”作用相同</code>
grep提取行,cut和awk提取列
0x02、cut
cut是一個選取指令,就是将一段資料經過分析,取出我們想要的。一般來說,選取資訊通常是針對“行”來進行分析的,并不是整篇資訊分析的
cut[選項] 檔案名
-f列号提取第幾列
-d分隔符按照指定分隔符分割列(預設使用的是制表符tab鍵)
<a href="http://s3.51cto.com/wyfs02/M00/88/81/wKioL1f6RimSYT9pAAAr2cDUiEo928.png" target="_blank"></a>
<code>和grep結合使用,cat /etc/passwd | grep /bin/bash | grep -v root | cut -d</code><code>":"</code> <code>-f 1</code>
<a href="http://s5.51cto.com/wyfs02/M01/88/84/wKiom1f6RlHRdYNPAAArdoqHC_E482.png" target="_blank"></a>
cut指令的局限線
cut指令對于空格符分割,不能很好的提取,可以使用awk指令解決
0x03、awk
和cut指令作用一樣,截取符合條件的列,grep是截取符合條件的行,但cut有些局限,awl也可以通過制表符,冒号等分隔符截取,功能遠比cut強大,但awk是一個非常複雜的指令,不但可以實作字元串的截取,還可以在awk指令中進行程式設計調用,最常見的可以進行函數,判斷等。是以把awk一直說是awk程式設計。但僅僅是簡單的截取列,又不是用空格作分割的話,cut指令更簡單。
awk是一個強大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對資料分析并生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符将每行切片,切開的部分再進行各種分析處理。
awk ‘條件1{動作1}條件2{動作2}...’檔案名
條件
一般使用關系表達式作為條件
x>10判斷變量x是否大于10
x>=10大于等于
x<=10小于等于
動作
格式化輸出
流程控制語句
<a href="http://s1.51cto.com/wyfs02/M00/88/81/wKioL1f6Rqbi5ZfRAAAQkKrLZGk612.png" target="_blank"></a>
$1代表第一列,$2代表第二列,$0代表整一行
FS内置變量
<code>awk </code><code>'{FS=":"}{print $1"\t" $3}'</code> <code>/etc/passwd,使用FS=””,指定分割符,第一行已經讀完,用冒号分割已經來不及了,預設的用空格分割,後面的用冒号分割,在</code>
<code>FS之前強制加個BEGIN</code>
<a href="http://s2.51cto.com/wyfs02/M02/88/84/wKiom1f6RtPx9WjXAAAjQByHUrw589.png" target="_blank"></a>
關系運算符
<code>cat /etc/passwd | awk </code><code>'{FS=":"} $3>=500 {printf $1"\n"}'</code>
<a href="http://s1.51cto.com/wyfs02/M01/88/81/wKioL1f6RvGAOk9EAAARGRWHr8E086.png" target="_blank"></a>
0x04、printf
printf是在awk中的标準輸出格式
printf ‘輸出類型輸出格式’輸出内容
輸出類型:
%ns:輸出字元串,n是數字指代輸出幾個字元
%ni:輸出是整數,n是數字指代輸出幾個數字
%m.nf:輸出浮點數。m和n是數字,指代輸出的整數位數和小數位數。加%8.2f代表共輸出8位數,其中2位是小數,6位是整數。
輸出格式:
\a:輸出警告聲音
\b:輸出倒退符,也就是backspace鍵
\f:清楚螢幕
\n:換行
\r:回車,也就是Enter鍵
\t:水準輸出倒退鍵,也就是Tab鍵
\v:垂直輸出倒退鍵,也就是Tab鍵
<a href="http://s3.51cto.com/wyfs02/M01/88/84/wKiom1f6RnvBnTvHAAALB3G0S_Q535.png" target="_blank"></a>
在awk指令的輸出中支援print和printf指令
print:print會在每個輸出之後自動加入一個換行符(linux預設沒有print指令)
printf:printf是标準格式輸出指令,并不會自動加入換行符,如果需要換行,需要手工加入換行符。
0x05、sed
sed是一種幾乎包括在所有unix平台(包括linux)的輕量級流編輯器。sed主要是用來将資料進行選取、替換、删除、新增的指令。
vim也可以進行選取,删除,替換等,但是vim隻能對檔案進行修改,但是不可以直接對指令的結果進行修改,需先把指令儲存到檔案中,再對檔案進行修改。而sed可以從管道符接收資料進行修改
<a href="http://s5.51cto.com/wyfs02/M00/88/81/wKioL1f6RzuCFAIlAAAKoBrgM_c982.png" target="_blank"></a>
sed [選項] ‘[動作]’檔案名
常見選項
-n一般sed指令會把所有資料都輸出到螢幕,加入此參數,則隻會把經過sed指令處理的行輸出到螢幕
-e允許對輸入資料應用多條sed指令編輯
-i用sed的修改結果直接修改讀取資料的檔案,而不是由螢幕輸出
動作:
a\:追加,在目前行後添加一行或多行。添加多行時,除最後一行外,每行末尾需要用“\”代表資料未完結。
c\:行要用\”代表資料為完結。
替換,用c後面的字元串替換原來資料行,替換多行時,除最後一行外,每行末尾需i\:插入,在目前行前插入一行或多行,插入多行時,除最後一行外,每行末尾需要用\”代表資料為完結。
d:删除,删除指定的行。
p:輸出、列印指定的行。
s:字串替換,用一個字元串替換另外一個字元串。格式為“行範圍s/舊字串/新字串/g”(和vim中的替換格式類似)。
<code>sed -n </code><code>"1p"</code> <code>/etc/passwd ,檢視etc/passwd中的第一行,如果不加-n參數,顯示這條操作外,還會顯示檔案的全部内容,加-n</code>
<code>隻會顯示處理的行</code>
<a href="http://s2.51cto.com/wyfs02/M01/88/84/wKiom1f6R2Tx7pjFAAAJvLESAHw843.png" target="_blank"></a>
<code>sed </code><code>"2,36d"</code> <code>/etc/passwd ,删除第二行到第四行的資料,但不修改檔案本身,隻有加了-i參數才會修改檔案本身</code>
<a href="http://s2.51cto.com/wyfs02/M01/88/84/wKiom1f6R4GA4WI3AAAJ0wXpjvk014.png" target="_blank"></a>
動作a和i都是添加,a是追加在行尾,i是插入在行前,但不都會修改檔案本身,隻會先顯示上做修改,不加-n 除了虎顯示修改的資料,還會顯示文本的所有資料。
<a href="http://s3.51cto.com/wyfs02/M00/88/81/wKioL1f6R52jfz_JAAAWelHEwgU265.png" target="_blank"></a>
<a href="http://s2.51cto.com/wyfs02/M02/88/84/wKiom1f6R7LQXMXsAAASrodbDQE234.png" target="_blank"></a>
動作c和動作s都是進行替換,c進行的是行的替換,s進行的是字元串的替換,字元替換的格式是sed “s/舊字元串/新字元串/g”檔案名,在s前指定行隻需改指定的行,不指定會修改所有的。
<a href="http://s2.51cto.com/wyfs02/M02/88/84/wKiom1f6R-KweIekAAAQb5sbLjc675.png" target="_blank"></a>
<a href="http://s2.51cto.com/wyfs02/M02/88/81/wKioL1f6R_fDXZmeAAANo3vu9dY677.png" target="_blank"></a>
0x06、sort 排序指令
sort 【選項】 檔案名
選項
-f忽略大小寫
-n以數值型進行排序,預設使用字元串排序
-r反向排序
-t指定分隔符,預設使用的是制表符tab鍵
-k n[,m]按照指定的字段範圍排序,從第n字段開始,m字段結束,不加m預設到行尾
<a href="http://s2.51cto.com/wyfs02/M01/88/81/wKioL1f6SBTB0-4eAAA1TV_X5ms089.png" target="_blank"></a>
<code>sort -t </code><code>":"</code> <code>-k 3,3 /etc/passwd,仔細看,沒把uid當作字元串對待,而當數值型對待,需要加-n參數</code>
<a href="http://s5.51cto.com/wyfs02/M00/88/84/wKiom1f6SEHD2wyTAAA83xtYfxQ187.png" target="_blank"></a>
本文轉自 wt7315 51CTO部落格,原文連結:http://blog.51cto.com/wt7315/1860063