grep,sed,awk的用法舉例

 本文出自 「周鈺欽」 博客,請務必保留此出處http://zhouyuqin.blog.51cto.com/5132926/967141   node

事前準備
1.主機
node1:172.16.133.11
2.做爲實驗的文件
/etc/passwd正則表達式


/etc/fstabshell


qinqinexpress

cp /etc/passwd .  cp /etc/fstab .


1、grep用法詳解
1.grep是幹什麼的
grep的全名是Galobal research Regular Expression and Pringtiong,即搜索正則表達式,也就是說grep簡單來說就是用來搜索匹配字符的
2.grep分類
grep有基本正則表達式和擴展正則表達式之分,不過她們的做用域和使用方法大同小異
3.grep用法及選項
首先普通的用法:grep [option] 'PATTERN' file file2...
例:grep 'root' /etc/passwd搜索在/etc/passwd中的root字符的那一行
選項:
--color將搜索到的字符予以顏色加以標識,易於辨認
grep --color 'root' passwd數組


-v取反,即除了匹配到的行其他都顯示
grep -v 'root' passwdbash


-i忽略大小寫進行匹配
grep -i 'label' fstabless


-o僅顯示匹配到的字符串
grep -o 'root' passwdtcp


   單獨顯示本機ip地址和子網掩碼
  編輯器

ifconfig | grep -E -o --color "\<([1-9]|[1-9][0-9]|1[1-9][1-9]|2[1-5][0-5])\>.\<([1-9]|[1-9][0-9]|1[1-9][1-9]|2[1-5][0-5])\>.\<([1-9]|[1-9][0-9]|1[1-9][1-9]|2[1-5][0-5])\>.\<([1-9]|[1-9][0-9]|1[1-9][1-9]|2[1-5][0-5])\>"

-q靜默模式,不輸出,在shell腳本中常常用到
grep -q 'root' passwdide


-A匹配到的行向下多顯示n行,匹配到root後,連其後的n行一併顯示
grep -A 2 'root' fstab


-B匹配到的行向上多顯示n行,匹配到root後,連其上的n行一併顯示
grep -B 3 'student' passwd


-C匹配到的行多顯示其上下n行,匹配到root後,其上下n行一併顯示
grep -C 3 'xfs' passwd


4.基本正則表達式
.(點號):表示匹配任意單個字符;
grep -o "r." passwd


*匹配前面一個字符任意次(能夠是0次)
grep 'ab*c' qinqin


.*:表示任意長度的任意字符(兩個一塊兒用時,貪婪模式,能匹配多長就匹配多長)
grep -o "r.*" passwd


[]指定範圍內的任意單個字符[^a-z]指定範圍內以外的字符
grep "a[a-z]c" qinqin


X\{m,n\}:X出現大於m次,小於n次
grep "ab\{1,3\}c" qinqin


X\{m,\}:X出現大於m次,無上限
grep "ab\{2,\}c" qinqin


X\{0,n\}:X出現小於n次
grep "ab\{0,2\}c" qinqin


?:匹配其前面的字符0次或一次(-E,使用擴展表達式)
grep -E 'ab?c' qinqin


錨定符:
^:錨定行首(行首匹配)
grep "^root" passwd


$:錨定行尾(行尾匹配)
grep "bash$" passwd


^$:空白行
\<或者\b:錨定詞首;
grep "\<root" passwd


\>或者\b:錨定詞尾
grep "bash\>" passwd


\(\):分組後向引用:\1,\2
grep "l\([0-9]\{1,\}\):\1:.* \1" /etc/inittab


5.擴展正則表達式
extended regexp:擴展正則表達式(egrep支持這種)
\{\}-->{}
\(\)-->()
+:作次數匹配,表示匹配其前的字符一次或屢次
|:或者 a|b,C|cat:C,cat;(C|c)at:Cat,cat
明標籤時使用 :label的格式,跳轉時不用冒號;
2、sed命令詳解
1.sed是什麼
Sed全名爲Stream EDitor,即流式編輯器,行編輯器
2.sed經常使用用法
    sed [options] 'script(模式命令)' input_file...
    sed [options] -f script_file(sed腳本) input_file...
sed 'ADDR1,ADDR2command' input_file;例如sed '1,2d' fstab(可輸出重定向到別的文件)
sed '1,2!(對命令取反)d' fstab除了第一行,第二行,其他全刪除


sed '/PATTERN/command' input_file(使用基本正則表達式的原字符,而不實用grep)
sed '/PATTERN1/,/PATTERN2/command' input_file從第一次被模式PATTERN1匹配到的行到第一次被PATTERN2匹配到的行執行命令command
3.sed經常使用選項及模式
(1).經常使用選項
-n靜默模式,不打印模式空間中的內容,例如sed '1,3p' fstab會顯示全部文件,其中前三行,顯示兩次,加了-n以後只會顯示前三行
sed -n '1,3p' fstab

-i直接操做原文件

-i
sed -i '5d' fstab


-r使用擴展正則表達式
-e多腳本處理
sed -e 's/a/e/g' -e 's/b/f/g' -e 's/c/g/g' qinqin
(2).經常使用模式
d刪除指定行
p模式空間中的文本在處理以前,每一次都會先顯示:p,顯示,指定行會被顯示兩次
$表示最後一行
a \:在模式匹配到的行後面添加新內容
sed '/a/a \this is a comment line.\n' qinqin


r FILE:讀文件追加到別的文件後面
sed '2r qinqin' fstab
i \:在模式匹配到的行前面添加新內容
sed '/abc/i \this is a test' qinqin


w FILE:把這個文件中模式所匹配到的行寫到另外一個文件中
sed -n '/root/w qinqin' fstab


s :s/PATTERN/string/ 例如:s@/dev/vo10/root@/dev/sda2/
   g:匹配全文
   i:忽略大小寫
   s/PATTERN/&string/在前面匹配到的PATTERN後面加上string
   sed 's/root/qinqin/g' fstab


n:讀取下一行,以覆蓋方式,一次讀進來
sed 'n;p' fstab


N:讀取下一行,以追加方式,在模式空間中兩行作一行處理(N;N三行一塊兒處理)
sed 'N;p' fstab


     擴展sed 'N;s/\n/ /g' fstab


g:將保留空間中的內容複製到模式空間,覆蓋的方式
sed 'g' fstab


G:將保留空間中的內容複製到模式空間,追加的方式
sed 'G' fstab
 

h:將模式中的模式空間複製到保留空間,覆蓋的方式
sed -n 'h;n;G;h;n;G;p' fstab


H:將模式中的模式空間複製到保留空間,追加的方式
sed -n 'H;n;G;h;n;G;p' fstab


b label:跳轉 例如:sed -n '3b;p'跳轉到第三行 seb '\#b' test跳過有#號的行
x:將保留空間和模式空間對調 
t label: 測試:前面的s命令執行成功就跳轉到標記位置
3、awk命令詳解
awk經常使用用法
awk [options] 'script' file1, file2, ...
awk [options] 'PATTERN { action }' file1, file2, ...
-F指定分隔符
1.awk的輸出:
(1).print
print的使用格式:
 print item1, item2, ...
要點:
①.各項目之間使用逗號隔開,而輸出時則以空白字符分隔;
②.輸出的item能夠爲字符串或數值、當前記錄的字段(如$1)、變量或awk的表達式;數值會先轉換爲字符串,然後再輸出;
③.print命令後面的item能夠省略,此時其功能至關於print $0, 所以,若是想輸出空白行,則須要使用print "";
例子:
awk 'BEGIN { print "line one\nline two\nline three" }'
awk -F: '{ print $1, $2 }' passwd


④.內置變量:
ORS(output record separator)
OFS(output field separator)
FS: field separator,默認是空白字符;
RS: Record separator,默認是換行符;
NR: The number of input records,awk命令所處理的記錄數;若是有多個文件,這個數目會把處理的多個文件中行統一計數;
NF:Number of Field,當前記錄的field個數;
FNR: 與NR不一樣的是,FNR用於記錄正處理的行是當前這一文件中被總共處理的行數;
ARGV: 數組,保存命令行自己這個字符串,如awk '{print $0}' a.txt b.txt這個命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;
ARGC: awk命令的參數的個數;
(2).printf
printf命令的使用格式:
printf format, item1, item2, ...
要點:
①.其與print命令的最大不一樣是,printf須要指定format;
②.format用於指定後面的每一個item的輸出格式;
③.printf語句不會自動打印換行符;\n
④.format格式的指示符都以%開頭,後跟一個字符;以下:
%c: 顯示字符的ASCII碼;
%d, %i:十進制整數;
%e, %E:科學計數法顯示數值;
%f: 顯示浮點數;
%g, %G: 以科學計數法的格式或浮點數的格式顯示數值;
%s: 顯示字符串;
%u: 無符號整數;
%%: 顯示%自身;
⑤.修飾符:
N: 顯示寬度;
-: 左對齊;
+:顯示數值符號;
例子:
awk -F: '{printf "%-15s %i\n",$1,$3}' passwd


2.awk輸出重定向
print items > output-file
print items >> output-file
print items | command
特殊文件描述符:
/dev/stdin:標準輸入
/dev/sdtout: 標準輸出
/dev/stderr: 錯誤輸出
/dev/fd/N: 某特定文件描述符,如/dev/stdin就至關於/dev/fd/0;
例子:
awk -F: '{printf "%-15s %i\n",$1,$3 >> "qinqin" }' passwd


3.awk的操做符:
(1).算術操做符:
-x: 負值
+x: 轉換爲數值;
x^y:
x**y: 次方
x*y: 乘法
x/y:除法
x+y:
x-y:
x%y:
(2).字符串操做符:
只有一個,並且不用寫出來,用於實現字符串鏈接;
(3).賦值操做符:
=
+=
-=
*=
/=
%=
^=
**=
++
--
須要注意的是,若是某模式爲=號,此時使用/=/可能會有語法錯誤,應以/[=]/替代;
(4).布爾值
awk中,任何非0值或非空字符串都爲真,反之就爲假;
(5).比較操做符:
x < y True if x is less than y.
x <= y True if x is less than or equal to y.
x > y True if x is greater than y.
x >= y True if x is greater than or equal to y.
x == y True if x is equal to y.
x != y True if x is not equal to y.
x ~ y True if the string x matches the regexp denoted by y.
x !~ y True if the string x does not match the regexp denoted by y.
subscript in array   True if the array array has an element with the subscript subscript.
(6)表達式間的邏輯關係符:
&&
||
(7).條件表達式:
selector?if-true-exp:if-false-exp
(8).函數調用:
function_name (para1,para2)
4.awk的模式:
awk 'program' input-file1 input-file2 ...
其中的program爲:
pattern { action }
pattern { action }
常見的模式類型:
(1).Regexp: 正則表達式,格式爲/regular expression/
(2).expresssion: 表達式,其值非0或爲非空字符時知足條件,如:$1 ~ /foo/ 或 $1 == "magedu",用運算符~(匹配)和~!(不匹配)。
(3).Ranges: 指定的匹配範圍,格式爲pat1,pat2
(4).BEGIN/END:特殊模式,僅在awk命令執行前運行一次或結束前運行一次
(5).Empty(空模式):匹配任意輸入行;
常見的Action有:
(1).Expressions:
(2).Control statements
(3).Compound statements
(4).Input statements
(5).Output statements
/正則表達式/:使用通配符的擴展集。
關係表達式:能夠用下面運算符表中的關係運算符進行操做,能夠是字符串或數字的比較,如$2>%1選擇第二個字段比第一個字段長的行。
模式匹配表達式:
模式,模式:指定一個行的範圍。該語法不能包括BEGIN和END模式。
BEGIN:讓用戶指定在第一條輸入記錄被處理以前所發生的動做,一般可在這裏設置全局變量。
END:讓用戶在最後一條輸入記錄被讀取以後發生的動做。
5.awk控制語句:
(1).if-else
語法:if (condition) {then-body} else {[ else-body ]}
例子:
awk -F: '{if ($1=="root") print $1, "Admin"; else print $1, "Common User"}' passwd


awk -F: '{if ($1=="root") printf "%-15s: %s\n", $1,"Admin"; else printf "%-15s: %s\n", $1, "Common User"}' passwd


awk -F: -v sum=0 '{if ($3>=500) sum++}END{print sum}' passwd


(2).while
語法: while (condition){statement1; statment2; ...}
(3).do-while
語法: do {statement1, statement2, ...} while (condition)
(4).for
語法: for ( variable assignment; condition; iteration process) { statement1, statement2, ...}
for循環還能夠用來遍歷數組元素:
語法: for (i in array) {statement1, statement2, ...}
(5).case
語法:switch (expression) { case VALUE or /REGEXP/: statement1, statement2,... default: statement1, ...}
(6).break 和 continue
經常使用於循環或case語句中
(7).next
提早結束對本行文本的處理,並接着處理下一行;
6.awk中使用數組:
array[index-expression]
index-expression可使用任意字符串;須要注意的是,若是某數據組元素事先不存在,那麼在引用其時,awk會自動建立此元素並初始化爲空串;所以,要判斷某數據組中是否存在某元素,須要使用index in array的方式。
要遍歷數組中的每個元素,須要使用以下的特殊結構:
for (var in array) { statement1, ... }
其中,var用於引用數組下標;
例子:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'


每出現一被/^tcp/模式匹配到的行,數組S[$NF]就加1,NF爲當前匹配到的行的最後一個字段,此處用其值作爲數組S的元素索引;
awk '{counts[$1]++}; END {for(url in counts) print counts[url], url}' /var/log/httpd/access_log
用法與上一個例子相同,用於統計某日誌文件中IP地的訪問量
7.awk的內置函數:
split(string, array [, fieldsep [, seps ] ])
功能:將string表示的字符串以fieldsep爲分隔符進行分隔,並將分隔後的結果保存至array爲名的數組中;
netstat -ant | awk '/:80/{split($5,clients,":");IP[clients[1]]++}END{for(i in IP){print IP[i],i}}' | sort -rn | head -50
length([string])
功能:返回string字符串中字符的個數;
substr(string, start [, length])
功能:取string字符串中的子串,從start開始,取length個;start從1開始計數;
system(command)
功能:執行系統command並將結果返回至awk命令
systime()
功能:取系統當前時間

本文出自 「周鈺欽」 博客,請務必保留此出處http://zhouyuqin.blog.51cto.com/5132926/967141

相關文章
相關標籤/搜索