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]=234234 delete 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 dddd ddd,324 ssss ssdd sdfsd sdf dddd sfdfsdf待處理資料
BEGIN{ FS="\n" RS="" # RS設定為""將可以解析多行記錄(以空行分隔) ORS="" #輸出記錄分隔符不要換行 } { x=1 while(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) | 格式化返回字串 |
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執行結果
相關推薦
linux —— shell 程式設計(文字處理)
導讀 本文為博文 linux —— shell 程式設計(整體框架與基礎筆記)的第4小點的拓展。(本文所有語句的測試均在 Ubuntu 16.04 LTS 上進行) 1、基本文字處理 sort :用於排序,常用引數 -t 指定一行的分隔符 -k 指定具體排序的規則
Linux Shell程式設計(17)——巢狀迴圈
巢狀迴圈就是在一個迴圈中還有一個迴圈,內部迴圈在外部迴圈體中.在外部迴圈的每次執行過程中都會觸發內部迴圈,直到內部迴圈執行結束.外部迴圈執行了多少次,內部迴圈就完成多少次.當然,不論是外部迴圈或內部迴圈
linux —— shell 程式設計(整體框架與基礎筆記)
導讀 關於shell程式設計基礎的學習,網上有很多資源,如果在校圖書館應該也有一些教程,所以這裡對於零碎的基礎不做詳細記錄,而只是對一些常用的概念、命令與操作做一個簡要的記錄,以備方便查詢。 (本文所有語句的測試均在 Ubuntu 16.04 LTS 上進行) 1
Linux Shell程式設計(11)——退出和退出狀態
exit命令一般用於結束一個指令碼,就像C語言的exit一樣。它也能返回一個值給父程序。每一個命令都能返回一個退出狀態(有時也看做返回狀態).一個命令執行成功返回0,一個執行不成功的命令則返回一個非零值,此值通常可以被解釋成一個對應的錯誤值。除了一些例外的情況,一個行為端莊的
Linux Shell 程式設計(一)
從程式設計師的角度來看, Shell本身是一種用C語言編寫的程式,從使用者的角度來看,Shell是使用者與Linux作業系統溝通的橋樑。使用者既可以輸入命令執行,又可以利用 Shell指令碼程式設計,完成更加複雜的操作。在Linux GUI日益完善的今天,在系統管理等領域
Linux 下程式設計(C語言)獲取檔案大小
程式碼: #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> int m
Shell程式設計5_文字處理三劍客(awk)
文字處理三劍客(awk) 1.awk介紹 AWK:三位創造者Aho、Weinberger和Kernighan統稱 官方定義:一個優秀的樣式掃描與處理工具 定位:AWK是一種用於處理文字的程式語言工具,主要用於格式化報文或從一個大的文字檔案中抽取資
(轉) linux socket 程式設計(C語言)
套接字是一種程序間的通訊的方法,不同於以往介紹的程序間通訊方法的是,它並不侷限於同一臺計算機的資源,例如檔案系統空間,共享記憶體或者訊息佇列。套接字可以認為是對管道概念的擴充套件——一臺機器上的程序可以使用套接字與另一臺機器上的程序通訊。因此客戶與伺服器可以分散在網路中。同一臺機器上的程序間也可以用
linux學習筆記之shell程式設計(一)正則表示式與字元處理
shell程式設計 基礎正則表示式 正則和萬用字元的區別:正則是包含匹配,匹配檔案內容,grep,awk等支援正則表示式。萬用字元是完全匹配,匹配檔名,例如find,ls不認識正則表示式 ####正則表示式常用的字元(注意區別於萬用字元裡面的符號)#### -*
Linux程式設計(Linux shell程式設計的例子:批量處理檔案)
各位看官們,咱們今天還是接著上一回的內容,列舉具體的例子給大家。閒話休說,言歸正轉。 各位看官們,在實際的工作中經常需要批量處理檔案,比如批量刪除檔案等。咱們今天就通過例子來說明 如何批量操作檔案
linux學習筆記之shell程式設計(一)
shell程式設計 基礎正則表示式 正則和萬用字元的區別:正則是包含匹配,匹配檔案內容,grep,awk等支援正則表示式。萬用字元是完全匹配,匹配檔名,例如find,ls不認識正則表示式 ####正則
linux學習筆記之shell程式設計(三)流程控制(3)---for迴圈
for迴圈 語法格式1:指定迴圈範圍 for 變數 in value1 value2... do something done 指令碼例項1 #!/bin/bash for i in 1 2
linux學習筆記之shell程式設計(三)流程控制(4)while迴圈和until迴圈
while迴圈和until迴圈 ###、 while迴圈 不定迴圈,程式碼格式: while [判斷] do something done 指令碼例項1: #!/bin/bash #從1加到
linux系統程式設計(一)--時間與錯誤處理
#inlcude<error.h> errno perror(); //列印錯誤 strerror //列印錯誤 #inlcude<time.h> //使用CLOCKS_PER_SEC //常量可以得到秒數 clock_t \\ typedef
linux學習筆記之shell程式設計(二)條件判斷
條件判斷 檔案存在與否 -d 是否存在為目錄 -e 是否是檔案 -f 是否存在為檔案 [-d /root && echo "yes" || echo "no"] -檔案讀寫執行許可權#### -r 讀許可權 -w 寫
linux CAN程式設計(二)----------- can_frame中can_id的資料組織形式及處理
轉載自:https://blog.csdn.net/qwaszx523/article/details/54984544 /** * struct can_frame - basic CAN frame structure * @can_id: CA
Shell程式設計(Linux )
shell程式設計:解釋型語言 ---- 執行時需要一個直譯器來解釋執行 (同為解釋型語言的還有python) c語言:編譯型語言 shell是一個作為使用者與Linux系統間介面的程式,他允許使用者向作業系統輸入需要執行的命令。 變數 (本
shell中的文字處理(grep,sed,awk命令)
grep 文字過濾命令sed 行編輯器awk 報告生成器一、grep命令 全面搜尋研究正則表示式並顯示出來grep 命令是一種強大的文字搜尋工具 , 根據使用者指定的“模式”對目標文字進行匹配檢查 , 列印匹配到的行 由正則表示式或者字元及基本文
Linux學習總結(十七)-shell 基礎知識
shell基礎 變量 特殊符號 該篇內容很雜,但還是不難理解,就不逐個貼圖舉例。 一 先介紹幾種常用字符: 1 * 匹配任意個任意字符2 ?匹配一個任意字符3 # 註釋符號,符號後的語句不被執行4 \脫意字符,後面跟帶含義字符時,照原字符輸出5 []匹配包含在[]之中的任意一個字符:例如[bc]
Linux學習筆記(二十三)shell介紹、history命令歷史、命令補全和別名、通配符、
alias shell 歷史命令 通配符 一、shell介紹 shell是一個命令解釋器,提供用戶和機器之間的交互 支持特定語法,比如邏輯判斷、循環 每個用戶都可以有自己特定的shell CentOS7默認shell為bash(Bourne Agin Shell) 還有zsh、ksh等、二、