Linux Unix shell 編程指南學習筆記(第二部分)

第七章  正則表達式介紹

匹配行首與行尾

匹配數據集

職匹配字母和數字


句點 “.” 匹配任意單字符。

^,在行首 匹配字符串或字符序列,如查詢當前目錄下的所有目錄:

ls -l | grep "^d"


在行尾以 “$”匹配字符串或字符  , 

匹配所有以sh結尾的行: sh$

匹配所有的空行: ^$

使用*匹配字符串中單字符或重複序列: skdf*jl


使用 \ 轉義特殊字符的含義: 特殊字符:   $  .   ''  '   *  [  ]  |   (   )   \   =   ?    等。


使用[]  匹配一個範圍或集合 , 在[]中使用  -  表示一個字符串範圍。


使用 \{ \} 匹配模式結果出現的次數。

pattern \{n\}     :    匹配模式出現 n 次 。

pattern \{n,\}    :  匹配模式最少出現n次

pattern \{n,m}    :p


第八章  grep 家族

grep 參數選項

匹配grep的一般模式

子匹配字母或數字,或者兩者混用

匹配字符串範圍


grep一般格式(默認從根目錄 ‘/’  開始查詢 ):

grep  [選項]   基本正則表達式(可爲字符串) [文件] (要查找的字符串最好用雙引號括起來)

grep 參數選項:

-c   :  只輸出匹配行的計數 

-i    :  不區分大小寫(只適用於單字符)

-h   :   查詢文件時不顯示文件名

-l    :   查詢多文件時,只輸出包含匹配字符的文件名

-n   :   顯示匹配行及行號

-s   :   不顯示不存在或無匹配文本的錯誤信息

-v   :   顯示不包含匹配文本的所有行


1、當前目錄查詢包含good 的所有doc文件:

grep    "good"   *.doc     .

2、統計文件  tmp.txt 中包含  good 字符串的行數

grep   -c   "good"   tmp.txt

3、打印tmp.txt 文件中匹配good的所有行

grep -n   "good"   tmp.txt

4、打印文件 tmp.txt 中所有不包含 good 的所有行

grep -v  "good"  tmp.txt

5、精確匹配(只打印包含單詞  good 的行 , 像 goodXXX的行則被篩選出去了)

grep     "good<Tab>"     tmp.txt

6、grep是大小寫敏感的的,要查詢大小寫不敏感需要指定 -i 選項 , 

grep -i "good"  tmp.txt

7、匹配一個範圍(匹配goo後面可接任意字母)

grep ‘goo[a-zA-Z]’ tmp.txt

8、在tmp.txt文件中匹配以 2 或 1 開頭的行

grep      '^[21]'      tmp.txt

9、在tmp.txt 文件中匹配不以2  或 1 開頭的行

grep      '^[^21]'      tmp.txt

10、在 tmp.txt 文件中匹配以 21 開頭的行

grep    '^21'  tmp.txt

11、在 tmp.txt 文件中匹配以 g 開頭 d 結尾 長度爲4的字符串

grep 'g..d'  tmp.txt

12、範圍組合

grep  '[a-zA-Z0-9]*'   tmp.txt  (匹配任何以字母數字組合的行)

13、模式出現機率

grep      '3\{2,\}'     tmp.txt    (在tmp.txt文件中查詢3至少重複出現兩次的行)

3只出現兩次 :3\{2\}

3重複出現2到6次:  3\{2,6}


14、grep 中的  與  模式

grep -E  "216|217" tmp.txt   (-E 允許使用擴展模式)


15、 查詢空行

grep '^$'  tmp.txt

16、查詢特殊字符

grep "\."  tmp.txt  (查詢   .  )

17、查詢  ip 地址

grep "[0-9]\{3\}\.[0-9]\{3\}\." tmp.txt


egrep

egrep  代表 expression 或者  extended grep , 它接收所有的正則表達式,用法跟grep類似。

fgrep

fgrep 允許查找字符串而不是一個模式,速度與grep相當。


第九章  AWK 介紹  (操作格式化文本)

抽取域

匹配正則表達式

比較域

向awk傳遞參數

基本的awk行操作和腳本

awk 語言最基本的功能是在文件或字符串中基於指定規則瀏覽和抽取信息。


使用awk 的三種方式(awk默認使用空格作爲分隔符,但是可以通過-F 指定分隔符):

1、命令行:  awk               [-F     field-separator]        'commands'       input-files

2、將所有awk命令插入一個文件,並是awk程序可執行,然後用awk命令解釋器作爲腳本首行。

3、將所有的awk命令插入一個單獨文件,然後調用   awk  -f awk-script-file input-file[s]


awk腳本由各種  操作  和 模式 組成。

awk命令格式:  awk   ' [BEGIN]        {實際操作}         [END]'    input file[s]


域和記錄: awk執行時,瀏覽域標記爲$1 , $2,...$n  . 這種方法稱爲域標識。

$1 , 表示第一域,以此類推   ; $0 表示所有的域

操作示例——創建database.txt文件,內容如下:

M.tansla	05/99	48311	Green	8	40	44
J.lulu		06/99	48317	gree	9	24	26
p.bunny		02/99	48	Yellow	12	26	28
J.troll		07/99	4824	Brown-3	12	26	26
L.Tansla	05/99	412	Brown-2	12	30	28

打印所有內容: awk      '{print $0}'     database.txt 

打印指定域:     awk      '{print   $1,$3}'    database,txt

打印報告頭:     awk      'BEGIN {print "Name\tBelt\n--------------------"} {print $1"\t"$4}'   database.txt
打印信息尾:     awk      '{print $1,$3}   {print  "read end!"}'   database.txt

沒有指定輸入文件時,默認從鍵盤輸入


awk 錯誤信息規則:

1、確保awk 命令用單引號括起來

2、確保命令內所有引號成對出現

3、確保用花括號括起動作語句,用圓括號括起條件語句

4、可能忘記花括號。


awk 中正則表達式

在awk 中正則表達式用 斜線  括起來 , 如 : /good/

awk 中條件操作符

操作符 描述
< 小於
<= 小於等於
== 等於
!= 不等於
>= 大於等於
~ 匹配正則表達式
! 不匹配正則表達式
在database.txt文件中域 4  匹配 Brown 的記錄:

awk     '{if($4~/Brown/) print $0}'   database.txt   (建議使用這種方法)

awk      '$0 ~ /Brown/'                     database.txt(另一種取得相同結果的方法)

精確匹配(使用==號):awk       '$3=="48" {print $0}'     database.txt   (匹配域3等於48的記錄,雙引號改爲單引號結果一致)

不匹配:awk          '$0 !~ /Brown/'        database.txt

設置大小寫:awk         '/[Gg]reen/'       database.txt

使用 && (與)  , ||  (或) , !(非)操作符:

&&:  awk      '{if ($1 ~ /troll/  && $4 ~ /Brown/) print $0}'    database.txt

||   :   awk      '{if ($1 ~ /lulu/  || $4 ~ /Brown/) print $0}'        database.txt

!:    awk '{if ($4 ! /Brown/) print $0}' database.txt


awk 內置變量表

A R G C			命令行參數個數
A R G V			命令行參數排列
E N V I R O N		支持隊列中系統環境變量的使用
FILENAME 		a w k瀏覽的文件名
F N R			瀏覽文件的記錄數
F S			設置輸入域分隔符,等價於命令行- F選項
N F			瀏覽記錄的域個數
N R			已讀的記錄數
O F S			輸出域分隔符
O R S			輸出記錄分隔符
R S			控制記錄分隔符

打印已經讀取記錄的數量: awk      'END {print NR}'     database.txt

打印每一條記錄域的個數,當前讀取的是第幾條記錄,每條記錄的內容,並且讀完之後打印記錄存儲的文件:

awk        '{print NF,NR,$0}         END {print FILENAME}'    database.txt

NF的另一個強大功能:echo $PWD | awk -F / '{print $NF}'  —— 打印目錄或文件名


awk 內置字符串函數

g s u b ( r, s )		在整個$ 0中用s替代r
g s u b ( r, s , t )		在整個t中用s替代r
i n d e x ( s , t )		返回s中字符串t的第一位置
l e n g t h ( s )		返回s長度
m a t c h ( s , r )		測試s是否包含匹配r的字符串
s p l i t ( s , a , f s )	在f s上將s分成序列a
s p r i n t ( f m t , e x p )	返回經f m t格式化後的e x p
s u b ( r, s )			用$ 0中最左邊最長的子串代替s
s u b s t r ( s , p )		返回字符串s中從p開始的後綴部分
s u b s t r ( s , p , n )	返回字符串s中從p開始長度爲n的後綴部分


printf 修飾符

-		左對齊
Wi d t h	域的步長,用0表示0步長
. p r e c	最大字符串長度,或小數點右邊的位數
printf 格式

% c		A S C I I字符
% d		整數
% e		浮點數,科學記數法
% f		浮點數,例如(1 2 3 . 4 4)
% g		a w k決定使用哪種浮點數轉換e或者f
% o		八進制數
% s		字符串
% x		十六進制數

第十章  sed 用法介紹

s e d是一個非交互性文本流編輯器。它編輯文件或標準輸入導出的文本拷貝。標準輸入可能是來自鍵盤、文件重定向、字符串或變量,或者是一個管道的文本。s e d可以隨意編輯小或大的文件,有許多s e d命令用來編輯、刪除,並允許做這項工作時不在現場。s e d一次性處理所有改變,因而變得很有效.

s e d從文件的一個文本行或從標準輸入的幾種格式中讀取數據,將之拷貝到一個編輯緩衝區,然後讀命令行或腳本的第一條命令,並使用這些命令查找模式或定位行號編輯它。重複此過程直到命令結束。


抽取域

匹配正則表達式

增加、附加、替換

基本的sed名理工和一行腳本


sed 的三種調用方式:

1、 sed        [選項]        sed命令        輸入文件

2、 sed         [選項]       -f      sed腳本文件       輸入文件

3、 sed腳本文件          [選項]             輸入文件

sed 選項:

n :   不打印 (缺省打印所有行)

p :   打印編輯行

c :   下一命令是編輯命令

f  :   指定sed腳本文件


使用sed時,在文本中定位的方式:默認從第一行開始,但是可以通過指定行號或者匹配正則表達式提取自己想要的內容。

X 					x爲一行號,如1
x , y					表示行號範圍從x到y,如2,5表示從第2行到第5行
/ p a t t e r n /			查詢包含模式的行。例如/ d i s k /或/[a-z]/ 
/ p a t t e r n / p a t t e r n /	查詢包含兩個模式的行。例如/ d i s k / d i s k s /
p a t t e r n / , x			在給定行號上查詢包含模式的行。如/ r i b b o n / , 3
x , / p a t t e r n /			通過行號和模式查詢匹配行。3 . / v d u /
x , y !					查詢不包含指定行號x和y的行。1 , 2 !

sed 編輯命令:

p		打印匹配行
=		顯示文件行號
a \		在定位行號後附加新文本信息
i \		在定位行號後插入新文本信息
D		刪除定位行
c \		用新文本替換定位文本
s		使用替換模式替換相應模式(s/ pattern / pattern/[p g w n])
r		從另一個文件中讀文本
w 		寫文本到一個文件
q 		第一個模式匹配完成後推出或立即推出
l 		顯示與八進制A S C I I代碼等價的控制字符
{ }		在定位行執行的命令組
n 		從另一個文件中讀文本下一行,並附加在下一行
g 		將模式2粘貼到/pattern n/
y		傳送字符
N 		延續到下一輸入行;允許跨行的模式匹配語句

對文件 sedlearn (默認就指該文件)只打印第二行:  sed     -n       '2p'     sedlearn  (如果不寫-n , 那麼會對所有的內容進行打印,並且第二行會重複打印一次) 。

打印文件範圍: sed      -n       '5,9p'     sedlearn   (如果範圍超出了文件的行數,那麼什麼也沒有)

打印包含love的行的內容:  sed  -n    '/love/p'   sedlearn

爲文件添加行號:    sed    =    sedlearn    |   sed    'N;s/\n/: /' (N; 讀取下一行內容並且追加到當前行末尾 , s/ XXX / YYY/  : 使用YYY模式替換 XXX模式  , 最好使用其他工具增加行號,如: nl)

顯示整個文件: sed     -n     '1,$p'      sedlearn

顯示刪除指定行後的內容:sed      -n    '3,6d;p'   sedlearn

追加插入文本: echo     "Hello , chen ! " |    sed    's/ chen/ mr&/g'


第十一章  合併與分割

sort

uniq

join

cut

paste

split


sort :

sort一般格式 : sort     [選項]    file

 sort 常用選項:

-c :測試文件是否已經分類。
-m :合併兩個分類文件。
-u :刪除所有複製行(去掉重複的行)。
-o :存儲s o r t結果的輸出文件名。

-b :使用域進行分類時,忽略第一個空格。
-n :指定分類是域上的數字分類。
-t :域分隔符;用非空格或t a b鍵分隔域(默認爲空格或一系列空格爲分隔符)。
-r :對分類次序或比較求逆。
+n :n爲域號。使用此域號開始分類。
n :n爲域號。在分類比較時忽略此域,一般與+ n一起使用。

-k :指定按照第 多好字段分類 , 比如  2 , 按照字段2 排序。
post1 :  傳遞到m,n。m爲域號,n爲開始分類字符數;例如4,6意即以第5域分類,從第7個字符開始。


實例:

以 : 爲域分隔符,先從第一域排序,忽略第二域,然後按第三域排序:sort   -t:   +1 -2 +3    sortdata.txt


head 和tail

head  -n : 查看文件的前  n 行

tail     -n :  查看文件的最後 n 行


uniq:

去重複行(連續重複的行纔去除,並不保證相同的內容只有一行)

格式:  uniq  [選項]  -f  input-file  output-file

選項:

-u: 只顯示不重複行

-d: 只顯示有重複數據行

-c:  打印每一重複行出現次數。
-f :  n爲數字,前n個域被忽略,一些系統不識別  -f 選項,使用 -n 替代。


join:

join用來將來自兩個已排序文檔的行鏈接在一起 (適用於數據量少)


cut

cut  用來從標準輸入或文本文件中剪切列或域。

格式:  cut   [選項]  file1  file2

選項:

-c list   指定剪切字符數。
-f field  指定剪切域數。
-d   指定與空格和t a b鍵不同的域分隔符。
- c 用來指定剪切範圍,如下所示:
- c 1,5-7  剪切第1個字符,然後是第5到第7個字符。
-c1-50  剪切前5 0個字符。
-f 格式與- c相同。
-f 1,5   剪切第1域,第5域。
- f 1,10-12  剪切第1域,第1 0域到第1 2域。


paste 

paste用來粘貼數據(一般配合cut 使用)

格式:  paste   [ 選項]  file1  file2

選項:

-d   指定不同於空格或t a b鍵的域分隔符。例如用@分隔域,使用- d @。
-s   將每個文件合併成行而不是按行粘貼。
-   使用標準輸入。例如ls -l |paste ,意即只在一列上顯示輸出。

實例: ls |  paste -d"===" - - - -  (ls輸出結果 以"==="爲分隔符,每行顯示四列) 


split

split 用來將大文件分割成小文件。

格式: split -output-file-size(文本文件被分割的行數)   input-file  output-file

如: split -3 filename (如果filename 有 10 行, 那麼被分割成四個文件,分別爲:xaa,xab,xac,xad)


第十二章  tr 用法

tr 用來從標準輸入中拖過替換或刪除操作進行字符轉換。(主要用來轉換或抽取控制字符


大小寫轉換

去除控制字符

刪除空行


格式: tr   [ 選項]     str_from    str_to

選項:

-c   用字符串1中字符集的補集替換此字符集,要求字符集爲A S C I I。
-d   刪除字符串1中所有輸入字符。
-s   刪除所有重複出現字符序列,只保留第一個;即將重複出現字符串壓縮爲一個字符串。
I n p u t - f i l e是轉換文件名。


tr 中控制符的各種表達方式:

速記符 含   義 八進制方式
\ a Ctrl-G 鈴聲 \ 0 0 7
\ b Ctrl-H 退格符 \ 0 1 0
\f  Ctrl-L 走行換頁 \ 0 1 4
\n  Ctrl-J 新行 \ 0 1 2
\ r Ctrl-M 回車 \ 0 1 5
\t  Ctrl-I tab鍵 \ 0 11
\ v Ctrl-X  \ 0 3 0


將所有的小寫字符轉換爲大寫字符: tr  "[a-z]"  "A-Z"

例舉當前目錄下的文件,每行顯示4列,讓後將小寫字母轉換爲大寫字母,並且去掉重複字母: 

ls  |  paste   -d  "  " - - - - | tr -s "[:lower:]" "[:upper:]"


發佈了89 篇原創文章 · 獲贊 12 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章