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