linux —— shell 编程(文本处理)
| 導(dǎo)讀 | 本文為博文 linux —— shell 編程(整體框架與基礎(chǔ)筆記)的第4小點(diǎn)的拓展。(本文所有語(yǔ)句的測(cè)試均在 Ubuntu 16.04 LTS 上進(jìn)行) |
| 目錄 |
sort :用于排序,常用參數(shù) -t 指定一行的分隔符 -k 指定具體排序的規(guī)則 -d 按字典序排列 ?-f 忽略大小寫(xiě)
?-u (unique)丟棄相同指定字段的記錄
unique:報(bào)告或刪除文件中重復(fù)的行。?-c 在輸出行前加上出現(xiàn)的次數(shù) ? ?-d ?(duplicated)顯示重復(fù)的行 ?
-u 僅顯示不重復(fù)的行?
wc: ?統(tǒng)計(jì)文本行數(shù),字?jǐn)?shù)和字符數(shù)。 ? ?-c 字符數(shù) ? ?-w ?單詞數(shù) ? ?-l ?行數(shù)
pr:將文本轉(zhuǎn)換成適合打印的格式。 ? -c 顯示的列數(shù)(截?cái)喑龅牟糠?
fmt: 優(yōu)化文本的格式。 ?-w 設(shè)置一行顯示的最大行寬 ? -s ?只對(duì)過(guò)長(zhǎng)的行進(jìn)行換行,不要自動(dòng)回填。
fold:限制文本寬度(強(qiáng)行截?cái)嗖Q行)。 -w 指定寬度 ?-s 只在空格處換行。
cut :截取行的字段。 ? -delimiter ?設(shè)置字段分割符 -f List 設(shè)置截取的域 ?
List可以是M,M-,M-N -M;可以用逗號(hào)指定多個(gè)
join:連接兩個(gè)文件的數(shù)據(jù)字段。 ?join file1 file2 ?-1 M ?-2 N ? ?M、N指定匹配的字段
tr: 文本替換。 tr set set :將str1上字符替換成str2上對(duì)于位置的字符; (可以是 tr 'a-z' 'A-Z')
?tr {-d|-s} set :-d 刪除set上的每一個(gè)字符 ;-s 除去連續(xù)出現(xiàn)的set中的字符,至只剩下單個(gè)
tr -c (complement 互補(bǔ))使用set1的外的其他字符 [例子:tr -cs '[:lower:][:upper:]' '[\n*]' 單詞表]
2、流編輯器sed0)sed 的作用和工作方式
sed 是一個(gè)非交互式的的行編輯器,工作時(shí),從指定的輸入讀入一行數(shù)據(jù)存入被稱(chēng)為模式空間(Pattern Space) 的臨時(shí)緩沖區(qū),然后按照指定的sed編輯命令處理緩沖區(qū)里面的內(nèi)容,將結(jié)果輸出到標(biāo)準(zhǔn)輸出后從模式空間中刪除,然后繼續(xù)讀取下一行繼續(xù)工作。
1) 地址范圍
sed -e '1,5d' test.txt sed -e '/^#/d' test.txt規(guī)則表達(dá)式中使用的表達(dá)式字符:
| 字符 | 描述 |
| ^ | 與行首匹配 |
| $ | 與行尾匹配 |
| . | 與任意一個(gè)字符匹配 |
| * | 與之前一個(gè)字符的零個(gè)或多個(gè)出現(xiàn)匹配 |
| [] | 與[]之間的所有字符匹配 |
?2) 參數(shù)
-e ? ? 將腳本添加到命令執(zhí)行,如上面的 '/^#/d'
-n ? ?禁止模式空間的自動(dòng)打印
替換文本: ? sed -e "s/benson/BENSON/g" ?將benson 替換成大寫(xiě)
sed -e "1,10s/benson/BENSON/g" 將1-10行的benson變成大寫(xiě)
? ? ?s/// 的 “/”可以被替換:比如 sed -e "s:/usr/local:/usr:g"?
多條命令一起執(zhí)行: ?sed -n -e "=;p" ? 打印行號(hào);打印行 (等價(jià)與 sed -e "=" -e "p" )
多條命令于同一地址范圍:sed -n -e '1,5{s/benson/BENSON/g;s/laur/LAUR/g}'
把命令放在文件fsed里:sed -n -f fsed?
3、awk模式掃描與處理語(yǔ)言awk 具有成為一門(mén)語(yǔ)言應(yīng)有的要素:變量,函數(shù)等,是強(qiáng)大的處理工具。
例子:
awk -F ":" '{print "USER:" $1 "\tSHELL: " $7 }' /etc/passwd 結(jié)果: USER:root SHELL: /bin/bash USER:daemon SHELL: /usr/sbin/nologin USER:sync SHELL: /bin/sync上面的命令也可以寫(xiě)入文件file.awk中:
awk -f file.awk /etc/passwd BEGIN{ FS=":" } {print "USER:" $1 "\tSHELL: " $7 } file.awk 3.1 awk的變量和數(shù)組1)用戶(hù)自定義變量
命名規(guī)則:[A-Za-z_][A-Za-z0-9_]*
2) 常用的內(nèi)建變量
| 變量 | 說(shuō)明 |
| FILENAME | 當(dāng)前輸入的文件名稱(chēng) |
| FNR | 當(dāng)前輸入的文件的記錄數(shù) |
| FS | 字段分隔符(支持正則表達(dá)式),默認(rèn)空格 |
| NF | 當(dāng)前記錄的字段數(shù) |
| NR | 在工作(job)中的記錄數(shù) |
| OFS | 輸出字段分隔字符 |
| ORS | 輸出記錄分隔字符(默認(rèn)為“\n”) |
| RS | 輸入記錄分隔字符 |
3) awk數(shù)組 ?的字符索引支持?jǐn)?shù)字、字符串
sit[google]="https://google.com" sit[baidu]="http;//baidu.com"數(shù)組存儲(chǔ)是稀疏的,可直接定義如下兩項(xiàng): x[1]=1234 x[1000]=234234delete x 將刪除數(shù)組里所有的元素刪除后,可以繼續(xù)定義如下: x=567訪問(wèn)環(huán)境變量:ENVIRON["PATH"]
3.2 算數(shù)運(yùn)算| 運(yùn)算符 | 描述 | 例子 |
| = ?+= ?*= ? /= ?^= ?**= | 賦值 | ? |
| ?= | C條件表達(dá)式 | ? |
| || ? && | 邏輯與或 | ? |
| ++-- | 自增自減 | ? |
| ~ ? ~! | 匹配正則表達(dá)式和不匹配正則表達(dá)式 | ? |
| < ? <= ?> ?>= ?!= ?== | 關(guān)系運(yùn)算符 | ? |
| 空格 | 連接 | ? |
| + - | 加、減 | ? |
| * / ?% | 乘除 求余 | ? |
| + ?- ?! | 一元加減,邏輯非 | ? |
| ^ ?*** | 求冪 | ? |
| $ | 字段引用 | ? |
| in | 數(shù)組成員 | ? |
awk支持的算數(shù)函數(shù):
sin(x) cos(x) atan2(x,2) :x,y 范圍內(nèi)的余切 int(x):沒(méi)有舍入地取整 exp(x)求冪 log(x):自然對(duì)數(shù) sqrt(x)?
rand():產(chǎn)生>=0 <1的隨機(jī)數(shù) srand(x):x是rand()的種子
3.3 條件和循環(huán)語(yǔ)句條件語(yǔ)句和循環(huán)語(yǔ)句與C類(lèi)似,支持break,continue(可以不使用;結(jié)尾)
例子:將下面記錄每組一行輸出
abc,123 tttt ddddddd,324 ssss ssdd sdfsd sdf dddd sfdfsdf 待處理數(shù)據(jù) BEGIN{FS="\n"RS="" # RS設(shè)置為""將可以解析多行記錄(以空行分隔)ORS="" #輸出記錄分隔符不要換行 } {x=1while(x<NF){print $x "\t"x++}print $NF "\n" } 使用while循環(huán)結(jié)果:
abc,123 tttt dddd ddd,324 ssss ssdd sdfsd sdf dddd sfdfsdf 處理結(jié)果 3.4 自定義函數(shù)在函數(shù)中,指定的參數(shù)將被當(dāng)做局部變量,而所有函數(shù)體內(nèi)未出現(xiàn)在參數(shù)列表中的變量會(huì)被視為全局性。為此,awk允許聲明過(guò)多的參數(shù)用于局部使用如:
function add(x,y, sum) { sum = x+y return sum }如果需要使用函數(shù)進(jìn)行引用傳遞,只能通過(guò)傳入數(shù)組來(lái)實(shí)現(xiàn):
引用傳遞 3.5 字符串處理格式化輸出:
printf("%s have %d jobs","somebody",3) strout = sprintf("%s have %d jobs","somebody",3)格式化輸出的轉(zhuǎn)義字符:c s d ld (十進(jìn)制長(zhǎng)整數(shù)) u lu x lx o lo e(科學(xué)計(jì)數(shù)法表示的浮點(diǎn)數(shù)) f g(e或f中比較短的一種)
printf 修飾符: ?- 左對(duì)齊 ? ? #顯示八進(jìn)制時(shí)在前面加個(gè)0;顯示十六進(jìn)制時(shí)在前面加0x ?
?+顯示defg 轉(zhuǎn)換的整數(shù)時(shí),加上正負(fù)號(hào) ? ?0 ?填充空白為0
具體的格式為:%-width.precision fotmat-specifier
awk內(nèi)置字符串函數(shù):
| awk函數(shù) | 描述 |
| sub(/reg/,newsubstr,str) | 替換第一個(gè)匹配的字符串 |
| gsub(/reg/,newsubstr,str) | 替換所有匹配 |
| index(str,substr) | 返回substr在str中的索引 |
| length(str) | 長(zhǎng)度 |
| match(str,/reg/) | 如果在str中找到正則表達(dá)式/reg/匹配的串,則返回出現(xiàn)的位置,未找到則返回0 |
| split(str,array,sep) | 使用sep分隔到array |
| substr(str,position[,length]) | 返回str從position開(kāi)始的length個(gè)字符 |
| tolower(str) | 變小寫(xiě) |
| toupper(str) | 變大寫(xiě) |
| sprintf("fmt",expr) | 格式化返回字符串 |
?
3.6 多文件處理 10001 南京 佛擋殺佛 sdfsdf 10002 天津 發(fā)生地方 雙方的發(fā)生 10003 石家莊 發(fā)生地方 發(fā)生地方 a.txt 11000,南京 11003,天津 12000,河北省 13000,品上線(xiàn) 12344,石家莊 b.txt BEGIN{FS="[ ,]"OFS="," }NR <= FNR{array[$2]=$1 } NR > FNR{print $1,$2,array[$2] } join.awk awk -f join.awk a.txt b.txt 11000,南京,10001 11003,天津,10002 12000,河北省, 13000,品上線(xiàn), 12344,石家莊,10003 執(zhí)行結(jié)果?
轉(zhuǎn)載于:https://www.cnblogs.com/BensonLaur/p/6080635.html
總結(jié)
以上是生活随笔為你收集整理的linux —— shell 编程(文本处理)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python测试app性能_App性能测
- 下一篇: 【转】【Linux】linux awk命