小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

我與阿里云的一千零一夜-012-挑個(gè)趁手兵器(其四)

 偏扁豆 2021-11-28

0x0 前言

十八般兵器不必樣樣精通,但習(xí)武之人底子得扎實(shí)。

shell腳本或各類腳本命令就是我們?cè)朴?jì)算環(huán)境下繞不開的“底子”,我們經(jīng)??吹剿^的《精通Linux課程》等等都是對(duì)于常見Linux知識(shí)、工具命令和shell腳本的運(yùn)用。

今天我們要重溫一下Linux“三劍客”的功夫底子,awk,sed,grep。
三劍客的功能非常強(qiáng)大,但我們只需要掌握他們分別擅長的領(lǐng)域即可:grep擅長查找功能,sed擅長取行和替換。awk擅長取列。

0x1 關(guān)于awk

awk是處理文本文件的一個(gè)應(yīng)用程序,幾乎所有 Linux 系統(tǒng)都自帶這個(gè)程序。它依次處理文件的每一行,并讀取里面的每一個(gè)字段。


awk其實(shí)不僅僅是工具軟件,還是一種編程語言。

先說它的常用功能:取列:

# 對(duì)于一行文字,默認(rèn)awk會(huì)利用空格將其分割,返回分割后的字符列表echo 'this is a test' | awk '{print $3}'# print是打印命令,你將得到一個(gè)字母 a
# 對(duì)于不是采用空格分隔的一行字符echo 'root:x:0:0:root:/root:/usr/bin/zsh' | awk -F ':' '{ print $1 }'# 你將得到root字符

編程基本知識(shí):
# 變量內(nèi)置變量就是awk預(yù)定義好的、內(nèi)置在awk內(nèi)部的變量,而自定義變量就是用戶定義的變量。用$取數(shù) FS(Field Separator):輸入字段分隔符, 默認(rèn)為空白字符 OFS(Out of Field Separator):輸出字段分隔符, 默認(rèn)為空白字符 RS(Record Separator):輸入記錄分隔符(輸入換行符), 指定輸入時(shí)的換行符 ORS(Output Record Separate):輸出記錄分隔符(輸出換行符),輸出時(shí)用指定符號(hào)代替換行符 NF(Number for Field):當(dāng)前行的字段的個(gè)數(shù)(即當(dāng)前行被分割成了幾列) NR(Number of Record):行號(hào),當(dāng)前處理的文本行的行號(hào)。 FNR:各文件分別計(jì)數(shù)的行號(hào) ARGC:命令行參數(shù)的個(gè)數(shù) ARGV:數(shù)組,保存的是命令行所給定的各參數(shù)自定義變量的方法 方法一:-v varname=value ,變量名區(qū)分字符大小寫。 方法二:在program中直接定義。

輸入內(nèi)容

# 從文件awk '{[pattern] action}' {filenames} # 從管道cat test.log | awk '{[pattern] action}'

輸出內(nèi)容

# 在shell上打印print # 格式化打印printf "格式化串" , item1, item2, ... 不會(huì)自動(dòng)換行,F(xiàn)ORMAT中需要分別為后面每個(gè)item指定格式符
格式符 item表現(xiàn)形式%c 顯示字符的ASCII碼%d, %i 顯示十進(jìn)制整數(shù)%e, %E 顯示科學(xué)計(jì)數(shù)法數(shù)值%f 顯示為浮點(diǎn)數(shù)%g, %G 以科學(xué)計(jì)數(shù)法或浮點(diǎn)形式顯示數(shù)值%s 顯示字符串%u 無符號(hào)整數(shù)%% 顯示%自身#[.#] 第一個(gè)數(shù)字控制顯示的寬度;第二個(gè)#表示小數(shù)點(diǎn)后精度,%3.1f- 左對(duì)齊(默認(rèn)右對(duì)齊) %-15s+        顯示數(shù)值的正負(fù)符號(hào) %+d

正則匹配條件并執(zhí)行命令:

awk '/^a/&&/nologin$/ {print}' /etc/passwd # 打印以a開頭并且以nologin結(jié)尾的行

0x2 關(guān)于sed

sed也是逐行進(jìn)行處理的,但是它對(duì)于范圍的限定是基于行的。

先說它的常用功能:取行:

# 對(duì)日志文件里的1行進(jìn)行輸出cat /var/log/secure | sed -n '1,1p'# -n 是sed的參數(shù),代表靜默后臺(tái)處理''里面分為兩部分,最后一個(gè)字母代表操作,其它為范圍5 選擇第5行。2,5 選擇25行,共4行。1~2 選擇奇數(shù)行。2~2 選擇偶數(shù)行。2,+32,5的效果是一樣的,共4行。2,$ 從第二行到文件結(jié)尾。
p 對(duì)匹配內(nèi)容進(jìn)行打印。d 對(duì)匹配內(nèi)容進(jìn)行刪除,并打印。w 將匹配內(nèi)容寫入到其他地方。sed -n '2,5 w output.txt' file

sed替換功能也十分強(qiáng)大。

sed 's/要被取代的字串/新的字串/g'# g參數(shù)是flag參數(shù)g 默認(rèn)只匹配行中第一次出現(xiàn)的內(nèi)容,加上g,就可以全文替換了。p 當(dāng)使用了-n參數(shù),p將僅輸出匹配行內(nèi)容。w 和上面的w模式類似,但是它僅僅輸出有變換的行。i 這個(gè)參數(shù)比較重要,表示忽略大小寫。e 表示將輸出的每一行,執(zhí)行一個(gè)命令。不建議使用,可以使用xargs配合完成這種功能。
要被取代的字串 可以使用 正則表達(dá)式表達(dá)^ 行首$ 行尾. 單個(gè)字符* 0個(gè)或者多個(gè)匹配+ 1個(gè)或者多個(gè)匹配? 0個(gè)或者1個(gè)匹配{m} 前面的匹配重復(fù)m次{m,n} 前面的匹配重復(fù)m到n次\ 轉(zhuǎn)義字符[0-9] 匹配括號(hào)中的任何一個(gè)字符

sed參數(shù)的變化可以創(chuàng)建備份或在原文件上修改。

# 替換filesed -i 's/a/b/' file# 備份為file.baksed -i.bak 's/a/b/' file
0x3 關(guān)于grep

grep同樣是逐行進(jìn)行查找,所以一般它的輸出只篩選不改變行列的屬性。

先說它的常用功能:查找:

cat /var/log/secure | grep root# 搜索包含root字符串的行cat /var/log/secure | grep '.*Invalid.*root.*'# 搜索包含符合正則表達(dá)式(包含Invalid...root)字符串的行

grep還有一些常用參數(shù)。

選項(xiàng) 含義 功能描述-i  ignore case       忽略大小寫-v invert match 不匹配匹配的,或者反向-l file-with-match 輸出匹配的文件名-L  file-without-match 輸出不匹配的文件名-c count 輸出匹配的數(shù)目(行數(shù))-n  number             輸出匹配行的同時(shí)在前面加上文件名及在文件名中的行數(shù)-h no-filename 抑制文件名的輸出
0x4 小結(jié)

一個(gè)軟件的功能可以做到很強(qiáng)很大,利用awk和sed都能做到很復(fù)雜的工作,但是我們卻僅僅使用它們一部分工作,為什么?

因?yàn)樵S多時(shí)候我們看似用一個(gè)東西全部做了,可是卻會(huì)因此降低了整體的可讀性和可維護(hù)性,為后續(xù)工作開展埋下隱患。

我想這也是微服務(wù)之所以是趨勢(shì)的一大原因。

系統(tǒng)仍然是大系統(tǒng),但要使得脈絡(luò)清晰、生動(dòng)可感。

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多