1. 程式人生 > >linux —— shell 程式設計(文字處理)

linux —— shell 程式設計(文字處理)

導讀

本文為博文 linux —— shell 程式設計(整體框架與基礎筆記)的第4小點的拓展。(本文所有語句的測試均在 Ubuntu 16.04 LTS 上進行)

1、基本文字處理

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、流編輯器sed

0)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 算數運算
awk的運算子 
運算子 描述 例子
=  +=  *=   /=  ^=  **= 賦值
?= 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) 格式化返回字串
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
執行結果

相關推薦

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程式設計流程控制4while迴圈和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等、二、