grep
- Linux上文本出來三劍客
- grep:文本過濾(模式:pattern)工具;
- grep ,egrep ,fgrep
- sed:stream,editor,文本編輯工具;
- awk:Linux上的實現gawk ,文本報告生成器;
-
grep:
Global search REgular expression and Print out the line
- 作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查;打印匹配搭配的行;
- 模式:由正則表達式字符及文本字符所編寫的過濾條件;
- 正則表達式(REGEXP
):由一類特殊字符及文本字符所編寫的模式,其中有些字符不表達字符字面意義,而表示控制或通配的功能;
- 正則表達式分兩類
- 基本正則表達式;BRE
- 擴展正則表達式:ERE
- 這兩類有些元字符式相同的有些是不相同的
- grep一般的時候只支持基本正則表達式的、
- 所以我們要用egrep或grep -E 他們才能支持擴展的正則表達式
- 而fgrep 不支持正則表達式
- 正則表達式引擎:
如grep ,sed,awk,他們都支持正則表達式
但是他們所匹配時候的算法也就式引擎各不相同
或者是有細微差別
-
grep使用格式
- grep [OPTIONS] PATTERN [FILE...]
-
選項:
- -- color=auto:對匹配到的文本著色顯示;
- -v 顯示不能夠被pattern匹配到的行;
- -i 忽略字符大小寫
- -o 僅顯示匹配到的字符串
- -q 靜默模式,不輸出任何信息:(可以用echo $? 來查看)
- -A #:after,后#行
- -B #:before,前#行
- -C #:context ,前后各#行
- -E:使用(ERE)擴展正則表達式
基本正則表達式
字符匹配
.
:任意單個字符[ ]
:范圍內的任意單個字符[^ ]
: 范圍外的單個字符次數匹配
*
:任意長度的任意字符\?
:匹配其前面的字符0或1次:即前面的可有可無\+
: 匹配其前面的字符至少1次\{m\}
: 匹配前面的字符m次\{m.n\}
:匹配前面的字符至少m次,至多n次\{0,n\}
: 匹配前面的字符至多n次:可以沒有\{m,\}
: 匹配前面的字符至少m次-
位置錨定
$
:錨定行尾:模式的最右側^
:錨定行首:用于模式的最左側^PATTERN$
: 用于模式匹配整行:^$
空行:\<,\b
:詞首錨定:用于單詞模式的左側:-
\>,\b
:詞尾錨定:用于單詞的右側
-\<PATTERN\>
: 匹配正則單詞- 分組
\(\) :\(\)
將一個或多個字符捆綁在一起,當作一個整體進行處理,如:(root)+后向引用 \1,\2,\3......
后向引用:引用前面的分組括號中的模式所匹配字符,(而非模式本身)
NOte:分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命令方式為:\1,\2,\3.......
\1:從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
如:(ab+(xy)*);
\1:ab+(xy)*
\2:xy
egrep及擴展的正則表達式
grep = grep -E
- grep [OPTIONS] PATTERN [FILE...]\
- 擴展正則表達式的元字符:
- 字符匹配:
-
.
:匹配單個字符 -
[ ]
:范圍之外 -
[^]
:范圍之內 - 次數匹配:
- *:
- ?:0或多次:
- {m}:匹配m次
- {m/n}:至少m,至多n次
- 錨定:
- ^ :錨定行首
- $:錨定行尾
- <,\b:詞首錨定
- >,\b:詞尾錨定
- 分組:
( )
后向引用:\1,\2,.......
或者:
a|b
c|cat: C或cat
練習:
1,顯示當前系統root,centos或user1用戶的默認shell和UID:
答案:grep -E "^(root|centos|user1)>" /etc/passwd|cut-d: -f1,3,7
2,找出/etc/rc.d/init.d/functions文件(centos6)中某單詞后面跟一個小括號的行
答案“grep -E -o "[_[:alpha:]]+() /etc/rc.d/init.d/functiosns"
3,使用echo 輸出一絕對路徑,使用egrep取出其基名:
答案:echo "/mnt/sdc" | grep -E -o "[^/]+/?$|cut-d”/" -f1
4,找出ifconfig命令結果中1-255之間的數值:
5,找出ifconfig命令結果中的ip地址
bash的基礎特性
變量類型:
數據存儲格式,存儲空間大小,參與運算種類:
字符型、
數值型
他們分為整型和浮點型
強類型:定義變量時必須指定類型,參與運算必須符合類型要求,調用未聲明的變量會產生錯誤
弱類型 :無須指定類型,默認均為字符型:參與運算會自動進行隱式類型轉換,變量無效事先定義可直接調用
bash就式弱類型的編程語言
bash中的變量種類:
根據變量的生效范圍等標準:
本地變量:生效范圍為當前shell進程,對當前shell之外的其他shell進程,包括當前shell的子shell進程均無效
環(huán)境變量:生效范圍為當前shell進程及子shell
局部變量:生效范圍為當前shell進程中某代碼片段(通常指函數)
位置變量:
$1
,$2
,........來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給他的參數特殊變量
$?
,$0``$*
,$#
,#@
pstree進程樹
本地變量:
- 變量賦值:name=`value`
- 可以使用引用:
- value:
(1)可以式直接字符串:name="username"
(2)變量引用:name="$username"
(3)命令引用:name=COMMAND`,name=$(COMMAND)
- 變量引用:${name},或-$name
- " ":弱引用,其中的變量引用會被替換為變量值
- ·· :強引用,其中的變量引用不會被替換為變量值,而保持原字符串:
- 顯示已定義的所有變量
set
命令 - 銷毀變量
unset name
命令
環(huán)境變量
- 變量聲明,賦值:
- export name=VALUE
- declare -x name=VALUE
- 變量引用:$name,${name}
- 顯示所有環(huán)境變量:
- export
- env
- printenv
- 銷毀:
- unset name
bash由許多內建的環(huán)境變量:PATH,SHELL,UID,HISTSIZE,HOME,PWD,OLD,PS1,HISTFILE
變量命名法則:
1,不能使用程序中的關鍵字或保留字:if ,for 等等
2,只能使用數字,字面及下劃線,且不能以數字開頭;
3,盡量做到見名知義,
- 只讀變量:
- readonly name
- declare -r name
位置變量
- 位置變量主要在腳本代碼中調用通過命令行傳遞給腳本的參數
-
$1
,$2
......對應調用第1.第2等參數:$0命令本身:shift[n] -
$*
:傳遞給腳本的所有參數當做一個字符串 -
$@
:傳遞給腳本的所有參數每一個參數當做一個獨立的字符串 -
$#
:傳遞給腳本的參數的個數:
元字符 | 定義 |
---|---|
^ | 行首 |
$ | 行尾 |
. | 任意單一字符 |
[ ] | [ ]范圍內的任意單一字符 |
[^ ] | 除[ ^] 內的任意單一字符 |
* | *前面字符重復不確定次數 |
+ | +前面字符重復一次以上不確定次數 |
? | ?前面字符重復0或1次 |
\ | 轉義符 |
.* | 任意長度字符 |
{ n} | 前面字符重復n次 |
{n,} | 前面字符重復n次以上 |
元字符 | 定義 |
---|---|
[:alnum:] | 字母和數字 |
[:alpha:] | 代表任何英文大小寫字符,亦即 A-Z, a-z |
[:lower:] | 小寫字母 |
[:upper:] | 大寫字母 |
[:blank:] | 水平空白字符(空格和制表符) |
[:space:] | 所有水平和垂直的空白字符(比[:blank:]包含的范圍廣) |
[:cntrl:] | 不可打印的控制字符(退格、刪除、警鈴...) |
[:digit:] | 十進制數字 |
[:graph:] | 可打印的非空白字符 |
[:print:] | 可打印字符 |
[:punct:] | 標點符號 |
[:xdigit:] | 十六進制數字 |