天天看點

shell字元串截取總結

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&gt;10判斷變量x是否大于10

x&gt;=10大于等于

x&lt;=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&gt;=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

繼續閱讀