天天看點

linux之正規表達式篇

shell環境設定

shell也是一個應用程式,工作在使用者模式,運作表現為一個程序,通過pstree可以檢視到bash程序。

shell 程序用于通過指令行界面,類似windows的explore資料總管。

bourn:開發shell ,bsh-->sh

BSD:研發csh

korn:研發ksh(商業版,功能強大)。

bash-->bourn again shell,Bash-->開源,bsh的增強版

shell本身是解釋器,能夠了解其他指令,并且讓指令執行起來。了解語句,更具流程控制機制讓語句按需要執行。

      讀一句執行一句。

編譯器:了解源程式,并且能夠将源程式轉換成二進制代碼後執行。

      先将這個源程式轉換成二進制格式再執行。

編譯器:gcc

解釋器:bash python、perl

在編寫解釋型程式的時候,由于需要解釋器進行逐條解釋,所有在程式的開頭要寫明解釋器程式的位置。比如:”#!/bin/bash“

變量:記憶體空間的外在表現,是記憶體空間名稱,用于存儲資料。

變量類型:資料存儲格式,資料表示範圍:

 整型:

浮點型:

字元型:

布爾型:

字元:ascii,所有基本字元一共128個,至少需要7bits來表示所有的基本字元。

浮點:單精度,雙精度

使用變量的步驟(c、java):

1、聲明:給定一個變量類型。

2、聲明的同時給其一個初始值,這個過程叫初始化。

3、指派: int v=2

shell中的 變量

    屬于弱類型語言:

           1、不強制區分變量類型,無論存儲什麼資料,均預設是字元格式存儲。

           2、不需要事先聲明。直接使用,直接指派。

    定義變量

      [set]   var_name=value 有空格加“”

      引用變量:

       ${var_name} 通常‘{}’可以省略。{}通常用于對變量所定義數值的擴充

               比如: curname=gong 

                          echo “i am $curname”

                          echo  "she is ${curname}ziyan" 

      撤銷變量:

       unset    var_name

bash變量類型:

     本地變量:隻對目前shell程序有效,登出後無效。

     局部變量:對小範圍代碼段有效。其作用範圍不包括目前shell的所有位置。

                    設定方法:local var_name=value

    環境變量:對目前shell及子shell有效(可以通過指令“bash”進入子shell)。

                    設定方法:export var_name=value

     位置變量:$1/$2.........

     特殊變量:$$、$!、$?.........

bash變量也可以聲明,并指定類型:declare

      declare -i var_name:聲明一個整型變量。

      declare -x var_name:聲明一個環境變量。

      declare -a var_name:聲明一個數組。

bash中如何檢視環境變量:

printenv、export

檢視所有變量:set

變量的引用:${var_name}

    變量替換:隻能在雙引号中實作。

bash的引号:

雙引号:可以實作變量的替換。   

單引号:不替換,并且顯示字元串本身。

    比較:name= 'good dog'

              echo  this is“$name”

              echo this is ‘$name’ 

反引号:指令引用,引用反引号指令的執行結果。

BingGongtekiMacBook-Pro:~ binggong$ echo "this is `date +%T`"

this is 14:36:47

$( )應用執行結果

BingGongtekiMacBook-Pro:~ binggong$ echo "nihao $(date)"

nihao 2016年10月20日 星期四 14時27分52秒 CST

bash 指令行快捷方式:

 ctrl+u:删除指令行首至目前光标所在位置的内容。

 ctrl+k:删除目前光标到行尾的内容。

 ctrl+a:跳至行首部

 ctrl+e:跳至行尾部

 ctrl+l:清屏,相當于clear

 ctrl+c:終止程式

 ctrl+z:将目前指令送至背景執行。

語言控制結構:

1、順序執行

2、選擇執行

3、循環執行

當alias的定義别名與元指令名相同的時候,使用元指令時可以在指令前加\來表示。

檔案名通配符

?:用于比對一個任意字元

*:用來比對檔案名中的任意字元串,比對長度可以是0-n個

[]:比對[]内的任意一個字元

                    -可以表示一個範圍[a-z]

                     [acdf]表示任意一個字元

                     [!abdf]不比對括号内adbf的任意字元

多條指令中的邏輯運算符合括号

command1 || command2:邏輯或運算,command1執行成功就不執行command2,否則會執行command2,兩者選其一。

command1 && command2:邏輯與運作,command1執行成功才執行command2指令。

(command1;command2):優先執行()内部的指令,并按順序執行

{command1;command2}:調用子shell指令并執行{}内部的指令,其實質是函數。

正規表達式:指令輸出或者文本内容篩選查找。

使用位置:grep、awk、sed、vim

grep:支援基本的正規表達式,隻針對檔案進行查找工作

egrep:支援擴充正規表達式

tgrep:不支援正常表達式元字元,搜尋字元串速度快。

正規表達式是一類字元所書寫的模式。

元字元:不表示字元本身的意義,而用于額外功能的描述。通常元字元有兩類,一類比對具體的字元,一類比對位置,比如行首行尾。

^:瞄定行首的符合條件的字元表達式。 grep --color=auto ^ssh /etc/passwd

$:錨定行尾的符合條件的内容,用法“name$”

     ^$:空白行

.:比對任意單個字元。

*:比對緊挨在其前面的字元任意次數。

[]:配置指定範圍内的任意單個字元。

[^]:比對任意指定範圍外的單個字元。

[:lower:]:小寫

[:upper:]:大寫

[:digit:]:數字

[:space;]:空白字元

\?:比對緊挨在其前面的字元0-1次。

x\{m,n\}:比對其前面的字元至少m次,最多n次。

x\{0,n\}:至多n次

x\{m,\}:至少m次

x\{m\}:精确比對隻有m次。

\<:錨定詞首,用于定位單詞。也可以用\b 比如:\<word

\>:錨定詞尾,用于定位單詞,表示單詞的結尾是指定的内容比如: \>word   

\<word\>:完全錨定某一個單詞。

\(\):分組,将括号内的當成一個内容使用。當要求後面的内容和前面分組的内容相同時,可以使用\1來表示,1表示第幾個分組。

用法:\(parttern\)      例如:grep '\(s.x\).*\1 /etc/passwd   

例如:grep '^s\{1,2\}.*' /etc/passwd

         grep “[bB].\{2,6\}[tT]”/etc/passwd

         grep "[^]" 

組合使用正規表達式

grep的選項:

--color=auto  通過修改全局(環境)變量來改變顔色:export GREP_COLOR='01;33'

-v:反向查找,隻輸出比對内容以外的行。

-n:在結果輸出的同時,輸出行号

-i:不區分大小寫。

-o:隻顯示比對的字元串,而不是整個行。

-A n:顯示比對到的行時,順帶顯示器前面的n行

-B n 後面的n行

-C n:前後的n行。

-E:表示擴充正規表達式,可以使用“|”或方式查找,但不支援與方式,是以需要管道重定向來分開查找。

            grep -E 'gongbing|liuhaixiang' student.txt

-l:從多個檔案中查找,隻輸出比對内容的檔案名稱。

        grep -l "root" /etc/*

-h:從多個檔案中查找,隻輸出比對的内容,不顯示檔案名稱。

        grep -h "root" /etc/*

練習:

顯示/etc/rc.d/rc.sysinitd中以#開頭,并且後面跟一個或多個空白字元,而後又跟了任意非空白字元。

grep '^#[[:space:]]\{1,\}[^[:space:]]' /etc/rc.d/rc.sysinit

1、顯示/proc/cpuinfo中的processor開頭并且後面跟了一個空字元的行,而後統計相關的行數

2、顯示/var/log/secure檔案中包含“failed password”或者“failed login”的行;而後統計相關的行數。

3、顯示/var/log/secure檔案中記錄的屬于目前系統時間的前一天的資訊中包含“failed password”或者“failed login”的行,并統計行數

4、找出netstat -tan 指令執行的結果中以time_wait或者established結尾的行。

顯示某檔案中的一位數和兩位數。

grep  ‘\<[:digit:]\{1,2\}\>’/etc/passwd

基本正規表達式:

.   \?    *     \<    $     ^      []    \{n,m\} 等。

擴充正規表達式:

.:任意單個字元

[]:指定範圍内的單個字元

[^]:取反

*:任意多個

+:比對其前面的字元至少1次。

?:0或1次

{n,m}:至少m次,至多n次。

():分組,與基本正規表達式不同的是不需要\

a|b:二選其一。

sort:

-f:忽略大小寫

-n:以數字大小寫排序(預設是以字元方式排序)

-u:排序過程中删除結果相同的行。

-r:降序排列

-R:随機排序。

uniq:選取唯一值。

  -c:統計每行重複的次數。

  -u:顯示沒有重複的行

  -d:隻顯示重複過的行

   -t:指定分隔符

   -k:指定字段

        查找/etc/passwd檔案中使用bash的uid最小的使用者名

                 grep 'bash' /etc/passwd |sort -n -t : -k 3 |head -n 1 |cut -d : -f 1

有變量、轉義字元的時候需要使用雙引号。

bash的配置檔案:

profile類:互動式登陸的使用者

                  /etc/profile (全局,對所有使用者有效)

                  /etc/profile.d/*.sh:全局,對所有使用者有效,是對profile的補充。

                  ~/.bash_profile:僅對某使用者自己有效。

                                  功能:設定環境變量、運作指令和腳本

basher類:非互動式登陸的使用者

                  /etc/bashrc:全局有效

                 ~/.bashrc:僅對使用者自己有效。

                          功能:設定本地變量、定義使用者别名

假定新安裝jdk檔案,可執行指令為/usr/java/latest,需要指定環境變量(全局)JAVA_HOME。如何操作。

vi /etc/profile,也可在/etc/profile.d/建立一個配置檔案(java.sh),來進行配置。

添加: export JAVA_HOME=/etc/java/latest

. /etc/profile.d/java.sh  配置生效

echo $JAVA_HOME    檢視

在配置檔案更新後,新的定義不會立即生效,要想立即生效有兩種方式:

1、重新開機

2、source file

互動式模式就是shell等待你的輸入, 并且立即執行你送出的指令。這種模式被稱作互動式是因為shell與使用者進行互動。這種模式也是大多數使用者非常熟悉的:登入、執行一些指令、簽退。當你簽退後,shell也終止了。

shell也可以運作在另外一種模式:非互動式模式,以shell script(非互動)方式執行。在這種模式下,shell不與你進行互動,而是讀取存放在檔案中的指令,并且執行它們。當它讀到檔案的結尾,shell也就終止了

互動式登陸環境:

1、直接從終端登陸的使用者

2、su - username

非互動登陸:

1、su username

2、在圖形模式下,打開的一個僞終端。

3、執行腳本

讀取bash的順序:

互動式登陸:

      /etc/profile-->/etc/profile.d/*.sh-->~/.bash.profile-->~/.bashrc-->/etc/bashrc 最後執行的優先級高

非互動式登陸:

      ~/.bshrc-->/etc/bashrc-->/etc/profile.d/*.d

I/O重定向,管道

file disciptor,檔案描繪符,FD

标準輸入fd:0

标準輸出fd:1

錯誤輸出fd:2

将預設資料流改為其他裝置,就稱為io重定向。

>:覆寫重定向

>>:追加重定向

2>:錯誤覆寫重定向

2>>:錯誤追加重定向

ls /usr >/tmp/1 2>/tmp/2 同時對正确和錯誤的輸出進行操作。

&>标準輸出和錯誤輸出合并重定向到一個檔案

&>>标準輸出和錯誤輸出合并追加到一個檔案。

輸入重定向:

<:輸入重定向

<<:此處建立檔案。通常用于腳本中文檔的生成

cat >/tmp/123 <<eof(eof可任意寫)

管道的最後一個指令是在目前shell的子shell中執行的,所有不要用變量擷取結果。

t指令可以将重定向和管道結合起來使用,就是在将前一個指令的結果輸出到螢幕的同時還可以儲存到檔案,也就是說可以管道到下一個指令中。

SED 非互動式文本編輯器

指令本身并不會更改源檔案内容,如果要将修改結果儲存下載下傳,請使用輸出重定向

sed逐條讀取檔案并放到模式空間裡,通過編輯指令進行執行并将結果保持到保留白間中。

指令格式:

sed [選項] 指令 文本檔案名

選項:

-n:不列印全部内容,預設情況是對文本全部内容輸出資訊。

-e:連接配接多條編輯指令

-f:指定腳本檔案

編輯指令:

p:列印比對行

=:顯示指定的行号

a\:在定位行号後添加新文本資訊,\表示換行

i\:在定位行前添加文本資訊

c\:用新文本替換定位位置文本内容

d:删除定位行

s:使用替換模式

r:從另一個檔案中讀文本并替換

一、查找指定範圍

1、x:具體行号

        sed -n '2p' /etc/passwd

2、x,y:指定行範圍,1,7

        sed -n '1,10p' /etc/passwd

3、/pattern/:查找包含模式的行,/disk/

        sed -n '/nobody/p' /etc/passwd

4、x,/pattern/:從第n行開始到比對項之間的所有内容

        sed -n '/nobody/,$p' passwd

5、/pattern/,y:從比對内容開始向下到第n行。

        sed -n '1,/nobody/p' passwd

6、x,y!:排除指定的範圍

        sed -n '1,30!p' passwd

7、1,$:顯示所有行

8、$:列印最後一行

         sed -n '$p' passwd

二、列印行号

1、查找passwd檔案中的包含gong使用者的所在行号

sed '/gong/=' passwd

三、插入、替換指定内容

1、在passwd檔案,包含root的行後插入###############。

sed '/root/'a\ "###########" passwd

2、在passwd檔案,包含root的行前插入###############。

3、在passwd檔案,包含root的行替換為###############。

sed '/root/'c\ "############" passwd

4、在passwd檔案,删除###############。

sed "/####/"d passwd

四、替換文本

s/paterntofind/newpartern/[gpwn]

同i\a\的差別主要是:

i、a替換的是整行,而s替換的查找到的具體内容。

選項

g:全局查找替換所有符合的模式

1、替換passwd檔案中的gongbing 為liuhaixing

sed    's/gongbing/liuhaixiang/g' passwd

2、删除passwd檔案中的root

sed 's/root//g' passwd

&:表示對前一個模式所指的内容進行重新引用

比如: sed 's/gongbing/bingle &/g' passwd 表示在gongbing的前面添加一個bingle字元串。

顯示文本檔案的控制字元

1、cat -v passwd

2、sed '1.$l' passwd       l:小寫l表示顯示控制符

五、删除行

d:用來删除比對的行。

sed ‘/^28/d’ /etc/passwd

删除檔案中以28開頭的行。

sed -ne ‘/[Ll]ixia/d’-e '/shanghai/d' -e p students

多比對内容之間的删除操作需要-e的配合。

元字元終極總結

字元(Characters)

字元組(Character classes)

元字元(Metacharacter)  比對(Matches)

[abc]  simple class 比對 a 或 b 或 c

[^abc]  negation 比對 abc 之外的任何單個字元

[a-zA-Z]  range比對a到z或A到Z的任何單個字 符

[a-d[m-p]]  union 等同于[a-dm-p]

[a-z&&[def]]  intersection 比對 d, e 或 f

[a-z&&[^bc]]  subtraction 等同于[ad-z]

預定義字元組(Predefined character classes)

. dot 任何字元,能不能比對換行符取決于比對 模式

\d  digit 數字,等價于[0-9]

\D  non-digit 非數字,等價于[^0-9]

\s  whitespace 空白字元,等價于[ \t\n\x0B\f\r]

\S  non-whitespace 非空白字元,等價于[^\s]

\w  word 組成單詞的字元,等價于[a-zA-Z_0-9]

\W  non-word 不是組成單詞的字元,等價于[^\w]

POSIX 字元組

[:lower:]: 小寫

[:upper:]: 大寫

[:digit:]: 數字

[:space;]: 空白字元

零長度斷言

^ caret  行首

$  dollar 行尾

\b boundary 單詞邊界

\B  非單詞邊界

\<  單詞的起始位置

\>  單詞的結束位置

\A   字元串起始位置

\Z  字元串結束位置

\z  字元串結束位置

\G 次比對的起始位置或上次比對的結束 位置

(?=...)  positive lookahead 如果右邊能夠比對,則成功

(?!...)  negative lookahead 如果右邊不能夠比對,則成功

(?<=...)  positive lookbehind 如果左邊能夠比對,則成功

(?<!...)  negative lookbehind 如果左邊不能夠比對,則成功

貪婪量詞

X?  比對 X 0次或1次

X*  比對 X 0次或無數次

X+  比對 X 1次或無數次

X{n}  比對 X n 次

X{n,}  比對X 至少n次

X{n,m}  比對X 至少n次至多m次

非貪婪量詞

元字元(Metacharacter)  比對(Matches)

X??  比對X0次或1次

X*?  比對X0次或無數次

X+?  比對X1次或無數次

X{n}? 比對Xn次

 X{n,}?  比對X至少N次

X{n,m}? 比對X隻是N次至多M次

占有量詞

X?+  比對 X 0次或1次

X*+   比對 X 0次或無數次

X++   比對 X 1次或無數次

X{n}+   比對 X n 次

X{n,}+   比對X 至少n次

X{n,m}+   比對X 至少n次至多m次

分組,捕獲及後向引用

(...)  分組或捕獲

\n  引用第 n 個括号中比對的内容

(?<name>...)  命名捕獲

(?:...)  分組

(?>...)  固化分組

多選結構

元字元(Metacharacter) 比對 (Matches)

a|b|c 比對 a 或 b 或 c

條件判斷

元字元(Metacharacter)   比對(Matches)

(?if then |else)

條件為真,則比對 then 子表達式,否則比對 else 子表達式

比對模式

元字元(Metacharacter)  比對(Matches)

(?i:...)  不區分大小寫的比對模式

(?x:...)  注釋模式

(?s:...)  單行模式(點号通配模式)

(?m:...)  多行模式(增強的行錨點模式)

\Q...\E  文字文 模式

本文轉自 blackstome 51CTO部落格,原文連結:http://blog.51cto.com/137783/1895565,如需轉載請自行聯系原作者