2021-10-15

三劍客介紹

grep:基于正則表達式查找滿足條件的行;
awk:根據(jù)定位到的數(shù)據(jù)行處理其中的分段;
sed:根據(jù)定位到的數(shù)據(jù)行修改數(shù)據(jù);

三劍客用途

grep:數(shù)據(jù)查找定位,查找或匹配文本
awk:數(shù)據(jù)切片,格式化文本,對文本進行較復(fù)雜格式處理
sed:數(shù)據(jù)修改,編輯匹配到的文本

類比SQL

grep=select * from table
awk=select field from table
sed=update table set field=new where field=old

grep參數(shù)

grep pattern file 匹配行內(nèi)容
grep -i pattern file 忽略大小寫
grep -v pattern file 不顯示匹配的行
grep -o pattern file 把每個匹配的內(nèi)容用獨立的行顯示
grep -E pattern file 使用擴展正則表達式
grep -A -B -C pattern file 打印命中數(shù)據(jù)的上下文
grep pattern -r dir/ 遞歸搜索

pattern正則表達式

  1. 基本表達式(BRE)
    • ^ 開頭 $ 結(jié)尾
    • [a-z] [0-9] 區(qū)間
    • *0個或多個
  2. 基本正則(BRE)與擴展正則的區(qū)別(ERE)
  • ?非貪婪匹配
  • +一個或者多個
  • () 分組
  • {} 范圍約束
  • | 匹配多個表達式的任何一個

awk基礎(chǔ)

awk的基本語法如下
awk [options] ‘Pattern{Action}’ file

從字面上理解 ,action指的就是動作,awk擅長文本格式化,并且將格式化以后的文本輸出,所以awk最常用的動作就是print和printf,因為awk要把格式化完成后的文本輸出啊,所以,這兩個動作最常用。

我們先從最簡單用法開始了解awk,我們先不使用[options] ,也不指定pattern,直接使用最簡單的action,從而開始認識awk,示例如下

image.png

上圖中,我們只是使用awk執(zhí)行了一個打印的動作,將testd文件中的內(nèi)容打印了出來。

image.png

上圖中的示例沒有使用到options和pattern,上圖中的awk '{print $5}' ,

表示輸出df的信息的第5列,$5表示將當(dāng)前行按照分隔符分割后的第5列,不指定分隔符時,默認使用空格作為分隔符,細心的你一定發(fā)現(xiàn)了,上述信息用的空格不止有一個,而是有連續(xù)多個空格,awk自動將連續(xù)的空格理解為一個分割符了,是不是比cut命令要簡單很多,這樣比較簡單的例子,有利于我們開始了解awk。

awk是逐行處理的,逐行處理的意思就是說,當(dāng)awk處理一個文本時,會一行一行進行處理,處理完當(dāng)前行,再處理下一行,awk默認以”換行符”為標(biāo)記,識別每一行,也就是說,awk跟我們?nèi)祟愐粯樱看斡龅健被剀嚀Q行”,就認為是當(dāng)前行的結(jié)束,新的一行的開始,awk會按照用戶指定的分割符去分割當(dāng)前行,如果沒有指定分割符,默認使用空格作為分隔符。

image.png

0 表示顯示整行 ,NF表示當(dāng)前行分割后的最后一列(0和NF均為內(nèi)置變量)

注意,NF 和 NF 要表達的意思是不一樣的,對于awk來說,NF表示最后一個字段,NF表示當(dāng)前行被分隔符切開以后,一共有幾個字段。

也就是說,假如一行文本被空格分成了7段,那么NF的值就是7,NF的值就是7, 而7表示當(dāng)前行的第7個字段,也就是最后一列,那么每行的倒數(shù)第二列可以寫為(NF-1)。

我們也可以一次輸出多列,使用逗號隔開要輸出的多個列,如下,一次性輸出第一列和第二列

image.png

同理,也可以一次性輸出多個指定的列,如下圖

image.png

我們發(fā)現(xiàn),第一行并沒有第5列,所以并沒有輸出任何文本,而第二行有第五列,所以輸出了。

除了輸出文本中的列,我們還能夠添加自己的字段,將自己的字段與文件中的列結(jié)合起來,如下做法,都是可以的。

image.png

從上述實驗中可以看出,awk可以靈活的將我們指定的字符與每一列進行拼接,或者把指定的字符當(dāng)做一個新列插入到原來的列中,也就是awk格式化文本能力的體現(xiàn)。

但是要注意,1這種內(nèi)置變量的外側(cè)不能加入雙引號,否則1會被當(dāng)做文本輸出,示例如下

image.png

我們也可以輸出整行,比如,如下兩種寫法都表示輸出整行。

image.png

我們說過,awk的語法如下

awk [options] ‘Pattern{Action}’ file

而且我們說過awk是逐行處理的, 剛才已經(jīng)說過了最常用的Action:print

現(xiàn)在,我們來認識下一Pattern,也就是我們所說的模式

不過,我們準(zhǔn)備先把awk中最特殊的模式展示給大家,以后再介紹普通的模式,因為普通模式需要的篇幅比較長,所以我們先來總結(jié)特殊模式。

AWK 包含兩種特殊的模式:BEGIN 和 END。

BEGIN 模式指定了處理文本之前需要執(zhí)行的操作:

END 模式指定了處理完所有行之后所需要執(zhí)行的操作:

什么意思呢?光說不練不容易理解,我們來看一些小例子,先從BEGIN模式開始,示例如下

image.png

上述寫法表示,在開始處理test文件中的文本之前,先執(zhí)行打印動作,輸出的內(nèi)容為”aaa”,”bbb”.

也就是說,上述示例中,雖然指定了test文件作為輸入源,但是在開始處理test文本之前,需要先執(zhí)行BEGIN模式指定的”打印”操作

既然還沒有開始逐行處理test文件中的文本,那么是不是根本就不需要指定test文件呢,我們來試試。

image.png

經(jīng)過實驗發(fā)現(xiàn),還真是,我們并沒有給定任何輸入來源,awk就直接輸出信息了,因為,BEGIN模式表示,在處理指定的文本之前,需要先執(zhí)行BEGIN模式中指定的動作,而上述示例沒有給定任何輸入源,但是awk還是會先執(zhí)行BEGIN模式指定的”打印”動作,打印完成后,發(fā)現(xiàn)并沒有文本可以處理,于是就只完成了”打印 aaa bbb”的操作。

這個時候,如果我們想要awk先執(zhí)行BEGIN模式指定的動作,再根據(jù)執(zhí)我們自定義的動作去操作文本,該怎么辦呢?示例如下

image.png

上圖中先打印出了”aaa bbb”,當(dāng)BEGIN模式對應(yīng)的動作完成后,在使用后面的動作處理對應(yīng)的文本,即打印test文件中的第一列與第二列,這樣解釋應(yīng)該比較清楚了吧。

看完上述示例,似乎更加容易理解BEGIN模式是什么意思了,BEGIN模式的作用就是,在開始逐行處理文本之前,先執(zhí)行BEGIN模式所指定的動作。以此類推,END模式的作用就一目了然了,舉例如下。

image.png

END模式就是在處理完所有的指定的文本之后,需要指定的動作。

那么,我們可以結(jié)合BEGIN模式和END模式一起使用。示例如下

image.png

上述示例中返回的結(jié)果有沒有很像一張”報表”,有”表頭” 、”表內(nèi)容”、 “表尾”。

awk分隔符

awk有哪些分隔符,awk的默認分割符是空格,但是,這樣描述并不精確,因為,awk的分隔符還分為兩種,”輸入分隔符” 和 “輸出分隔符” 。

  1. 輸入分隔符,英文原文為field separator,此處簡稱為FS

    輸入分割符,默認是空白字符(即空格),awk默認以空白字符為分隔符對每一行進行分割。

  2. 輸出分割符,英文原文為output field separator,此處簡稱為OFS

    awk將每行分割后,輸出在屏幕上的時候,以什么字符作為分隔符,awk默認的輸出分割符也是空格。

輸入分隔符

輸入分隔符比較容易理解,當(dāng)awk逐行處理文本的時候,以輸入分隔符為準(zhǔn),將文本切成多個片段,默認使用空格,但是,如果一段文字中沒有空格,我們可以指定以特定的文字或符號作為輸入分割符,比如下圖中的例子,我們指定使用”#”作為輸入分隔符。

image.png

上圖中,我們使用了-F 選項,指定了使用#號作為輸入分隔符,于是,awk將每一行都通過#號為我們分割了。

除了使用 -F 選項指定輸入分隔符,還能夠通過設(shè)置內(nèi)部變量的方式,指定awk的輸入分隔符,awk內(nèi)置變量FS可以用于指定輸入分隔符,但是在使用變量時,需要使用-v選項,用于指定對應(yīng)的變量,比如 -v FS=’#’,如下圖

image.png

其實不管是通過-F選項,還是通過FS這個內(nèi)置變量,目的都是設(shè)置指定的輸入分隔符,達到的效果是相同的。

而此處,我們使用了awk中的一個選項,就是-F

我們說過,awk的語法如下

awk [options] ‘Pattern{Action}’ file

而-F,就是options的一種,用于指定輸入分隔符。

-v也是options的一種,用于設(shè)置變量的值。

我們已經(jīng)將options 、pattern 、action都簡單的應(yīng)用了一遍,好了,我們已經(jīng)”會用”awk了。

輸出分隔符

當(dāng)awk為我們輸出每一列的時候,會使用空格隔開每一列,其實,這個空格,就是awk的默認的輸出分隔符。

輸出分割符的意思就是:當(dāng)我們要對處理完的文本進行輸出的時候,以什么文本或符號作為分隔符。

我們可以使用awk的內(nèi)置變量OFS來設(shè)定awk的輸出分隔符,當(dāng)然,使用變量的時候要配合使用-v選項,示例如下

image.png

現(xiàn)在,我們可以同時指定輸入分隔符和輸出分割符了,示例如下

image.png

我們剛才解釋了awk的輸出分隔符,如果,在輸出的時候,我們想要讓兩列合并在一起顯示,不使用輸出分隔符分開顯示,該怎么做呢?如下圖所示,藍線之上使用默認的輸出分隔符進行了分隔,而藍線之下的兩種方法均未使用輸出分隔符進行分隔,而是將兩列合在一起顯示了。

image.png

awk ‘{print 12}’ 表示每行分割后,將第一列(第一個字段)和第二列(第二個字段)連接在一起輸出。

awk ‘{print 1,2}’ 表示每行分割后,將第一列(第一個字段)和第二列(第二個字段)以輸出分隔符隔開后顯示。

awk變量

對于awk來說”變量”又分為”內(nèi)置變量” 和 “自定義變量” , “輸入分隔符FS”和”輸出分隔符OFS”都屬于內(nèi)置變量。

內(nèi)置變量就是awk預(yù)定義好的、內(nèi)置在awk內(nèi)部的變量,而自定義變量就是用戶定義的變量。

我們先看看awk常用的一些內(nèi)置變量,此處先大致列出其概念,只看概念并不容易理解其意思,不懂沒關(guān)系,等到示例時你自然會明白。

awk常用的內(nèi)置變量以及其作用如下

FS:輸入字段分隔符, 默認為空白字符

OFS:輸出字段分隔符, 默認為空白字符

RS:輸入記錄分隔符(輸入換行符), 指定輸入時的換行符

ORS:輸出記錄分隔符(輸出換行符),輸出時用指定符號代替換行符

NF:number of Field,當(dāng)前行的字段的個數(shù)(即當(dāng)前行被分割成了幾列),字段數(shù)量

NR:行號,當(dāng)前處理的文本行的行號。

FNR:各文件分別計數(shù)的行號

FILENAME:當(dāng)前文件名

ARGC:命令行參數(shù)的個數(shù)

ARGV:數(shù)組,保存的是命令行所給定的各參數(shù)

內(nèi)置變量NR

內(nèi)置變量NR表示每一行的行號,內(nèi)置變量NF表示每一行中一共有幾列,那么,也就是說,我們可以通過下例中的方法,得到test文本中,每一行的行號以及每一行對應(yīng)的列的數(shù)量。

image.png

或者,利用NR內(nèi)置變量,先打印出行號,再打印出整行的內(nèi)容,相當(dāng)于為test中的每一行都添加了行號以后再進行輸出,示例如下。

image.png

就是在打印 0 ,1 , 2 這些內(nèi)置變量的時候,都有使用到””符號,但是在調(diào)用 NR , NF 這些內(nèi)置變量的時候,就沒有使用”$”,

如果你有點不習(xí)慣,那么可能是因為你已經(jīng)習(xí)慣了使用bash的語法去使用變量,在bash中,我們在引用變量時,都會使用$符進行引用,

但是在awk中,只有在引用0、1等內(nèi)置變量的值的時候才會用到”$”,

引用其他變量時,不管是內(nèi)置變量,還是自定義變量,都不使用”$”,而是直接使用變量名。

內(nèi)置變量FNR

當(dāng)我們使用awk同時處理多個文件,并且使用NR顯示行號的時候,效果如下圖。


image.png

從返回結(jié)果可以看出,awk處理多個文件的時候,如果使用NR顯示行號,那么,多個文件的所有行會按照順序進行排序。

可是,如果我們想要分別顯示兩個文件的行號,該怎么辦呢,這個時候就會用到內(nèi)置變量FNR,效果如下。

image.png

它的作用就是當(dāng)awk處理多個文件時,分別對每個文件的行數(shù)進行計數(shù)。

內(nèi)置變量RS

現(xiàn)在,我們來看看RS這個變量,我們說了,RS是輸入行分隔符,如果不指定,默認的”行分隔符”就是我們所理解的”回車換行”。

假設(shè),我們不想以默認的”回車換行”作為”行分隔符”,而是想使用空格作為所謂的行分隔符,也就是說,我們想讓awk認為,每遇到一個空格,就換行,換句話說,我們想讓awk以為每次遇到一個空格就是新的一行。那么我們該怎么做呢?示例如下。

image.png

如上圖所示,我們先使用了默認的”回車換行”作為”行分隔符”輸出了test文本,這時顯示文本一共有2行。

而后來,我們又指定了使用”空格”作為”行分隔符”輸出test文本,這時顯示文本一共有8行。

看到了嗎?當(dāng)我們指定使用空格作為”行分隔符”時,在awk解析文本時,每當(dāng)遇到空格,awk就認為遇到的空格是換行符,于是awk就將文本換行了,而此時人類理解的”回車換行”,對于awk來說并不是所謂的換行符,所以才會出現(xiàn)上圖中第4行的現(xiàn)象,即使從人類的角度去看是兩行文本,但是在awk的世界觀里,它就是一行。

默認情況下,awk使用”回車換行”作為”行分隔符(換行符)”,此時,人類的世界觀與awk的世界觀是一致的,因為我們和awk都認為,遇到回車換行,就表示當(dāng)前行結(jié)束,開始新的一行。

而當(dāng)我們指定了特定的”行分隔符”時,比如空格,那么當(dāng)awk遇到空格時,就認為當(dāng)前行結(jié)束了,新的一行開始了,此時,awk的世界觀與人類的世界觀已經(jīng)不同,人類仍然認為”回車換行”才是新的一行,awk卻認為”回車換行”并不是新的一行的開始,所以,從上圖中返回的信息中,我們可以看到,人類所以為的”兩行”,共用了一個行號,awk認為它們就是第4行。

這就是輸入行分隔符的使用方法。

內(nèi)置變量ORS

在理解”輸出行分隔符”O(jiān)RS之前,請先理解剛才描述的”輸入行分隔符”RS,否則理解起來可能比較困難。

默認情況下,awk將人類眼中的”回車換行”,當(dāng)做”輸出行分隔符”,此時,awk的”世界觀”與人類的”世界觀”是相同的。

現(xiàn)在,我們改變一下awk的想法,我們讓awk認為,”+++”才是真正的輸出行分隔符,示例如下圖


image.png

在沒有指定輸出行分隔符之前,awk跟人類的邏輯思維是一樣一樣的,當(dāng)人類想要換行的時候,就會”另起一行”(回車換行),awk也是一樣的,當(dāng)它在輸出文字的時候,如果想要換行,就會”另起一行”(回車換行), 可是,如果我們指定了”輸出行分隔符”為”+++”,那么,當(dāng)awk在輸出文字的時候,如果想要換行,就會”另起一行”(+++),所以,對于awk來說,它完成了”另起一行”的動作,只不過,它所認為的”另起一行”的動作就是輸出”+++”,而不再是原來的輸出” 回車換行”,所以,從人類看到的”表象上”,awk并沒有換行,那是因為我們還是以”回車換行”作為換行的標(biāo)準(zhǔn),而awk已經(jīng)變了,它認為,”+++”就是換行的標(biāo)準(zhǔn)。

我們把剛才學(xué)到的”輸入換行符”和”輸出換行符”同時使用,看看是什么效果,示例如下。

image.png
內(nèi)置變量FILENAME

FILENAME這個內(nèi)置變量,從字面上,就能看出是什么意思,沒錯,就是顯示文件名,演示效果如下。

image.png
內(nèi)置變量ARGC與ARGV

ARGC內(nèi)置變量表示命令行參數(shù)的個數(shù)
ARGV內(nèi)置變量表示的是一個數(shù)組,這個數(shù)組中保存的是命令行所給定的參數(shù)。

image.png

上圖中,我們先使用BEGIN模式,輸出一個字符串”aaa”,然后,傳入兩個文件的文件名作為參數(shù),我們發(fā)現(xiàn),BEGIN模式正常執(zhí)行了打印操作,輸出了”aaa”字符串 ,我們使用同樣的命令,同樣使用BEGIN模式,只不過,這次不只打印”aaa”,還打印ARGV這個數(shù)組中的第二個元素的值。

我說已經(jīng)說過,ARGV內(nèi)置變量表示的是一個數(shù)組,既然是數(shù)組,就需要用上圖中的下標(biāo)的方式,引用對應(yīng)元素的值,因為數(shù)組的索引都是從0開始的,所以,ARGV[1]表示引用ARGV數(shù)組中的第二個元素的值,從返回結(jié)果可以看出,ARGV[1]對應(yīng)的值為test1,同理,我們又使用第三條命令,多打印了一個ARGV[2]的值,發(fā)現(xiàn)ARGV[2]對應(yīng)的值為test2,這個時候,你明白ARGV內(nèi)置變量的含義了嗎,說白了,ARGV內(nèi)置變量表示的是:所有參數(shù)組成的數(shù)組。那么細心的你一定會問了,ARGV[0]對應(yīng)的是哪個參數(shù)呢,我們來打印一下。

image.png

第一個參數(shù)是awk命令本身,awk就是這么規(guī)定的,’pattern{ action }’并不被看做是參數(shù),awk被看做為參數(shù)。

在剛才的例子中,應(yīng)該有三個參數(shù),awk、test1、test2,這三個參數(shù)作為數(shù)組的元素存放于ARGV中,現(xiàn)在,而ARGC則表示參數(shù)的數(shù)量,也可以理解為ARGV數(shù)組的長度。示例如下

image.png
自定義變量

自定義變量,顧名思義,就是用戶定義的變量,有兩種方法可以自定義變量。

方法一:-v varname=value 變量名區(qū)分字符大小寫。

方法二:在program中直接定義。

我們來看一些小例子,即可明白上述兩種方法。

通過方法一自定義變量。


image.png

這種方式,與設(shè)置內(nèi)置變量的值的方法是一樣的。

使用方法二自定義變量,直接在program中定義即可,但是注意,變量定義與動作之間需要用分號”;”隔開。

image.png

當(dāng)然,我們也可以一次性定義多個變量

image.png

第一種方法雖然看上去比較麻煩,但是這種方法也有自己的優(yōu)勢

當(dāng)我們需要在awk中引用shell中的變量的時候,則可以通過方法一間接的引用。舉例如下


image.png

printf命令詳解

printf命令的作用是按照我們指定的格式輸出文本。

而提到輸出文本,echo命令,我們來對比一下,echo與printf有什么不同


image.png

從上述示例中可以看出,在輸出文本時,echo命令會對輸出的文本進行換行,而printf命令則不會對輸出的文本進行換行,那么,如果我們想要利用printf將輸出的文本換行,使用轉(zhuǎn)義符\n ,示例如下

image.png

假設(shè),我們有一串文本需要輸出,如下

image.png

現(xiàn)在我們有一個小需求,就是將上述文本按照空格分段,每段單獨輸出在一行里面。

image.png

上述示例中,命令1與命令2在輸出文本時,都使用了轉(zhuǎn)義字符\n將文本換行了,但是,在寫命令1與命令2的時候,我的內(nèi)心是崩潰的,因為,上述示例還算簡單,我只是將5段文本分成5行輸出即可,但是,如果是一個100段的文本呢?難道我們要在每一段中都添加一個轉(zhuǎn)義字符”\n”,那我的手不就打殘了,而命令3則不同,我只是通過printf指定了一個固定的”格式”,后面的每一段文本都按照指定的格式進行了換行,即使有10000段文本需要換行,我也不用擔(dān)心手殘的問題了,從這個小例子中,我們就能體會到printf的格式化能力,上圖中命令3中使用到的”格式”會在后面進行詳細的描述,不要著急。

printf命令的語法如下

printf “指定的格式” “文本1” “文本2” “文本3” ……

image.png

上述語法中的每一個”文本”都會被當(dāng)做參數(shù)項傳入printf命令,而每個被傳入的參數(shù)都會按照指定的”格式”被”格式化”。

命令3中的”%s\n”即為我們指定的”格式”,而后面的每一段字符串,都被當(dāng)做參數(shù)傳入到了printf命令中,并按照我們指定的格式進行了格式化。那么,我們現(xiàn)在來詳細的解釋一下上圖中的”%s\n”是什么意思。

我們先說說”%s”是什么意思,”%s”是一個”替身演員”,我們使用”%s”代替?zhèn)魅氲膮?shù),也就是說, “%s”代替了命令3中的abc,代替了def,代替了ghi,代替了每一個傳入的參數(shù),在我們指定的”格式”中,它代表了每一個傳入的參數(shù),所以,如果我們指定的格式為”%s\n”,當(dāng)abc被當(dāng)做參數(shù)傳入printf命令時,printf就會把”%s\n”中的%s替換成abc,于是,abc就變成了我們指定的格式”abc\n”,最終printf輸出的就是格式化后的”abc\n”,以此類推,每一段文本都被當(dāng)做一個參數(shù)傳入printf命令,然后按照指定的格式輸出了。

而”替身演員”只是我給”%s”起的一個外號,它的真名叫”格式替換符”,而printf中,”格式替換符”不只有”%s”一種,”%s”代替了每一個傳入的參數(shù),并將他們轉(zhuǎn)化成了”字符串類型”,我們再來認識一個新的替身演員,”%f” ,”%f”也代替了每一個傳入的參數(shù),與”%s”不同的是,”%f”會將每一個傳入的參數(shù)轉(zhuǎn)換成”浮點類型”,我們來看一個小例子。

image.png

上例中,我們分別使用了”%s”替換符和”%f”替換符格式化了相同的內(nèi)容,但是格式化后的結(jié)果卻不同。

“%f”自動將傳入的數(shù)字添加了小數(shù)點,將傳入的數(shù)字參數(shù)替換成了浮點數(shù)。

常用的格式替換符總結(jié)如下。

%s 字符串

%f 浮點格式(也就是我們概念中的float或者double)

%b 相對應(yīng)的參數(shù)中包含轉(zhuǎn)義字符時,可以使用此替換符進行替換,對應(yīng)的轉(zhuǎn)義字符會被轉(zhuǎn)義。

%c ASCII字符。顯示相對應(yīng)參數(shù)的第一個字符

%d, %i 十進制整數(shù)

%o 不帶正負號的八進制值

%u 不帶正負號的十進制值

%x 不帶正負號的十六進制值,使用a至f表示10至15

%X 不帶正負號的十六進制值,使用A至F表示10至15

%% 表示”%”本身

說完了”格式替換符”,再來說說”轉(zhuǎn)義字符”,剛才的示例中,我們只用到了”\n”這個轉(zhuǎn)義符,還有很多其他的轉(zhuǎn)義符,printf中的轉(zhuǎn)義字符與其他程序中的轉(zhuǎn)義字符沒有什么不同,此處我們只是總結(jié)出來,方便大家使用。printf常用的轉(zhuǎn)義符如下。

\a 警告字符,通常為ASCII的BEL字符

\b 后退

\c 抑制(不顯示)輸出結(jié)果中任何結(jié)尾的換行字符(只在%b格式指示符控制下的參數(shù)字符串中有效),而且,任何留在參數(shù)里的字符、任何接下來的參數(shù)以及任何留在格式字符串中的字符,都被忽略

\f 換頁(formfeed)

\n 換行

\r 回車(Carriage return)

\t 水平制表符

\v 垂直制表符

\ 一個字面上的反斜杠字符,即”\”本身。

\ddd 表示1到3位數(shù)八進制值的字符,僅在格式字符串中有效

\0ddd 表示1到3位的八進制值字符

假設(shè),我想為每個傳入的參數(shù)添加一對”括號”,并且括號內(nèi)側(cè)需要有空格,那么我們可以使用如下命令。

image.png

假設(shè),我們想要將每個傳入的參數(shù)使用”制表符”隔開,那么,可以使用如下命令。


image.png

剛才的舉例中,我們使用到的”格式”其實很簡單,每個”格式”中都只用到了一個”格式替換符”,現(xiàn)在,我們擴展一下,在格式中設(shè)置多個”格式替換符”試試,示例如下

image.png

看完上圖,我們所指定的”格式”中所包含的”格式替換符”的數(shù)量,就代表每次格式化的參數(shù)的數(shù)量,每個”格式替換符”與參數(shù)都是一一對應(yīng)的,上圖中,指定的”格式”中包含兩個”格式替換符”,那么printf每次進行”格式化”操作時,就會傳入兩個參數(shù),然后前一個參數(shù)對應(yīng)第一個替換符,后一個參數(shù)對應(yīng)第二個替換符,當(dāng)本次格式化操作完成以后,再傳入下一波參數(shù),示意圖如下


image.png

我們再驗證一遍上述理論,把之前的格式改為如下圖中的模樣


image.png

按照之前的理論,因為”格式”中包含3個”格式替換符”,所以每輪格式化都可以一次性格式化3個參數(shù),于是,第一次格式化操作將”%s %s %s\n”替換成了”a b c\n”,第二次格式化操作將”%s %s %s\n”替換成了”d e f\n”,格式化后的輸出入上圖所示。

awk格式化

利用awk中的printf動作,即可對文本進行格式化輸出,printf動作的用法與printf命令的用法非常相似,只是有略微的不同而已,不過,我們還是從最簡單的示例開始看起,首先對比一下print動作與printf動作的區(qū)別,示例如下


image.png

沒錯,printf動作與printf命令一樣,都不會輸出換行符,默認會將文本輸出在一行里面。

使用”格式替換符”來指定一下$1的格式,示例如下。

image.png

只是printf動作與printf命令在語法上唯一的不同點就是,在使用printf動作時,指定的”格式”與列($1)之間需要用”逗號”隔開,而使用printf命令時,指定的格式與傳入的文本不需要使用”逗號”隔開,如下圖所示

image.png

其實,它們還有一些其他的不同之處,我們在使用printf命令時,當(dāng)指定的格式中只有一個”格式替換符”,但是傳入了多個參數(shù)時,那么這多個參數(shù)可以重復(fù)的使用這一個格式替換符,示例如下

image.png

但是在awk中,我們則不能這樣使用,在awk中,格式替換符的數(shù)量必須與傳入的參數(shù)的數(shù)量相同,換句話說,格式替換符必須與需要格式化的參數(shù)一一對應(yīng),示例如下。

image.png

我們來總結(jié)一下,在awk中使用printf動作時,需要注意以下3點。

1)使用printf動作輸出的文本不會換行,如果需要換行,可以在對應(yīng)的”格式替換符”后加入”\n”進行轉(zhuǎn)義。

2)使用printf動作時,”指定的格式” 與 “被格式化的文本” 之間,需要用”逗號”隔開。

3)使用printf動作時,”格式”中的”格式替換符”必須與 “被格式化的文本” 一一對應(yīng)。

可以利用格式替換符對文本中的每一列進行格式化,示例如下。

image.png

我們可以利用awk的內(nèi)置變量FS,指定輸入字段分隔符,然后再利用printf動作,進行格式化,示例如下。

image.png

上例完美的體現(xiàn)了awk的格式化能力,因為awk本身負責(zé)文本切割,printf動作負責(zé)格式化文本。

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • awk: grep,sed,awk grep:文本過濾 sed:文本編輯 awk:文本格式化工具; 1 什么是aw...
    木林森閱讀 1,907評論 0 16
  • 常用 linux 命令集錦 文章涉及到vim\grep\cat\more\less\echo\sed\awk的入門...
    光劍書架上的書閱讀 361評論 0 3
  • 簡介 awk是一個強大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對數(shù)據(jù)分析并生成報告時,顯得尤...
    JokerW閱讀 579評論 0 1
  • 搬運 一、主要內(nèi)容 shell編程 sed命令 awk命令 crontab定時器 二、簡介 Shell是用戶與內(nèi)核...
    帥可兒妞閱讀 503評論 0 1
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,250評論 2 33

友情鏈接更多精彩內(nèi)容