linux正則表達式

基礎正則表達式

LANG=C A-Z a-z連續
LANG=zh_CN a A b B...
如果在語系LANG=zh_CN中[A-Z]會將b c選出來

特殊符合 代表意義
[:alnum:] 代表英文大小寫字符與數字
[:alpha:] 代表英文大小寫字符
[:blank:] 代表空格鍵和tab鍵
[:cntrl:] 代表鍵盤上面的控制按鍵,即包括CR,LF,Tab, Del等
[:digit:] 代表數字
[:graph:] 除了空格和tab外的其他所有按鍵
[:lower:] 小寫字符
[:print:] 任何可以被打印出來的字符
[:punct:] 代表標點字符,“ ‘ ? !;:# $
[:upper:] 大寫字符
[:space:] 任何會產生空白的字符,空格鍵 tab CR等
[:xdigit:] 代表十六進制的數字類型,0-9,A-F, a-F
// 顯示行號,并顯示查找到的行前面2行,后面3行
# grep -n -A3 -B2 --color=auto '搜尋字符串’ filename
// 不要空白行 -v是反向選擇
# grep -v '^$' filename
// 非g開頭的xoo
# grep -n '[^g]oo' filename
// 以小寫字母開頭
# grep -n '^[a-z]' filename
// 小數點代表一個任意字符
# grep -n 'g..d' filename
// 重復0個或者多個前面的RE(Regular Expression)字符,可以是控制符或者一個o以上的字符
# grep -n 'o*' filename
// g......g
# grep -n 'g.*g' filename
// 限定連續RE字符范圍{},在g與g之間有2個到3個存在的o
# grep -n 'go\{2,3\}g' filename
# ls -al | wc -l
wc - print newline, word, byte counts for each file

sed

# sed [-nefri] [動作】
參數:
-n : 安靜模式,經過sed特殊處理的那一行才會被列出來
-e : 直接在命令行模式進行sed的動作編輯
-f : 直接將sed的動作寫在一個文件內,-f filename則可以執行filename內的sed動作
# scriptfile 一行用;分隔
sed [options] -f scriptfile files
-r : sed的動作支持的是擴展型正則表達式的語法
-i : 直接修改讀取的文件內容,而不是由屏幕輸出
動作說明: [n1,[n2]] function

a\ 在當前行下面插入文本。 
i\ 在當前行上面插入文本。 
c\ 把選定的行改為新的文本。 
d 刪除,刪除選擇的行。
 D 刪除模板塊的第一行。
 s 替換指定字符
 h 拷貝模板塊的內容到內存中的緩沖區。
 H 追加模板塊的內容到內存中的緩沖區。
 g 獲得內存緩沖區的內容,并替代當前模板塊中的文本。 
G 獲得內存緩沖區的內容,并追加到當前模板塊文本的后面。
 l 列表不能打印字符的清單。
 n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。 
N 追加下一個輸入行到模板塊后面并在二者間嵌入一個新行,改變當前行號碼。
 p 打印模板塊的行。 P(大寫) 打印模板塊的第一行。
 q 退出Sed。
 b lable 分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾。 
r file 從file中讀行。
 t label if分支,從最后一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。 
T label 錯誤分支,從最后一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
 w file 寫并追加模板塊到file末尾。
 W file 寫并追加模板塊的第一行到file末尾。
 ! 表示后面的命令對所有沒有被選定的行發生作用。
 = 打印當前行號碼。
 # 把注釋擴展到下一個換行符以前。

g 表示行內全面替換。 
p 表示打印行。
 w 表示把行寫入一個文件。
 x 表示互換模板塊中的文本和緩沖區中的文本。 
y 表示把一個字符翻譯為另外的字符(但是不用于正則表達式)
 \1 子串匹配標記 
& 已匹配字符串標記

^ 匹配行開始,如:/^sed/匹配所有以sed開頭的行。 
$ 匹配行結束,如:/sed$/匹配所有以sed結尾的行。
 . 匹配一個非換行符的任意字符,如:/s.d/匹配s后接一個任意字符,最后是d。
 * 匹配0個或多個字符,如:/*sed/匹配所有模板是一個或多個空格后緊跟sed的行。
 [] 匹配一個指定范圍內的字符,如/[sS]ed/匹配sed和Sed。
 [^] 匹配一個不在指定范圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行。
 \(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers。 
& 保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**。 
\< 匹配單詞的開始,如:/\ 匹配單詞的結束,如/love\
>/匹配包含以love結尾的單詞的行。
 x\{m\} 重復字符x,m次,如:/0\{5\}/匹配包含5個0的行。
 x\{m,\} 重復字符x,至少m次,如:/0\{5,\}/匹配至少有5個0的行。 
x\{m,n\} 重復字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10個0的行。

s : 替換,可以搭配正則表達式 s/old/new/Ng  從第N處匹配處開始替換
默認定界符是/。也可以用其他任意
#刪除最后一行
sed '$d' file
# 刪除文件中所有開頭為test的行
sed '/^test/'d file

# nl /etc/passwd | sed '2,5d'
nl : 將文件內容打印到stdout
// 在第二行后面新增2行
# nl /etc/passd | sed '2a Drinking tea ....'
> drink bear ?'
# cat /etc/man.config | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'
// sed后面如果要接超過2個以上的動作,每個動作前面要加-e
# sed -e '4d' -e '6c no six line' filename
// 查看文件內容中特殊字符
# sed -n l filename
# ??-i.bak是啥東西
# sed -i.bak "s/gt 600/gt 900/g" filename
// 所有在test和check所確定的范圍內的行都將被打印
sed -n '/test/,/check/p' file
// 打印從第5行開始到第一個包括test開始的行之間的所有行
sed -n '5,/^test/p' file
// 對于模板test和west之間的行,每行的末尾用字符串aaa bbb替換
sed '/test/,/west/s/$/aaa bbb/' file
// 從文件讀入: r命令
// file里的內容被讀進來,顯示在與test匹配的行后面,如果匹配多行,則file的內容將顯示在所有匹配行的下面
sed '/test/r file' filename
// 寫入文件 w
sed -n '/test/w file' example
// 追加(行下)a\
sed '/^test/a\this is a test line' file
// 在第2行之后(行下)插入
sed -i '2a\this is a test line' file
// 插入(行上):i\
sed '/^test/i\this is a test line' file
sed -i '5i\this is a test line' test.conf
// 下一個:n命令
// 如果test被匹配,則移動到匹配行的下一行,替換這一行的aa,變為bb,并打印該行,然后繼續
sed '/test/{ n; s/aa/bb/;}' file
// 變形:y命令
// 把1~10行內所有abcde轉變為大寫,注意,正則表達式元字符不能使用這個命令:
sed '1,10y/abcde/ABCDE/' file
// 打印完第10行后,退出
sed ‘10q' file
sed -n 'p;n' test.txt #奇數行 
sed -n 'n;p' test.txt #偶數行 
sed -n '1~2p' test.txt #奇數行 
sed -n '2~2p' test.txt #偶數行 
打印匹配字符串的下一行 
grep -A 1 SCC URFILE 
sed -n '/SCC/{n;p}' URFILE 
awk '/SCC/{getline; print}' URFILE

//保持和獲取h和G
在sed處理文件的時候,每一行都被保存在一個叫模式空間的臨時緩沖區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將 打印在屏幕上。接著模式空間被清空,并存入新的一行等待處理。
sed -e '/test/h' -e '$G' file
互換模式空間和保持緩沖區的內容。也就是把包含test與check的行互換:
sed -e '/test/h' -e '/check/x' file

sed不支持\d這種選項
sed后'{print }'。里面()"需要轉義
sed表達式可以使用單引號來引用,但是如果表達式內部包含變量字符串,就需要使用雙引號
也可以使用new_db_name=${new_db_name/$replace_string/$replace_with}

如果替換字符串中含有\,替換的時候回出現sed: -e expression #1, char 6: unterminated `s' command](http://blog.csdn.net/wengyupeng/article/details/51840394)
web=$(curl | sed 's/\//g')

擴展正則表達式

egrep === grep -E

RE字符 意義和范例
+ 重復一個或一個以上的前一個RE字符
egrep -n 'go+d' filename
god good goo...d
0個或者1個的前一個RE字符
egrep -n 'go?d' filename
gd god

egrep -nr 'gd
goood' filename
() 找出組字符串
egrep -n 'g(lad
oo)d filename
glad good
()+ 多重組的判別
egrep 'A(xyz)+C' filename
AxyzC AxyzxyzC Axyzxyz....C

那個!在正則表達式當中不是特殊字符

printf '打印格式‘ 實際內容
參數:
\a : 警告聲音輸出
\b : 退格鍵
\f :清除屏幕
\n : 輸出新的一行
\r : enter
\t : 水平tab
\v : 垂直tab
\xNN : NN為兩位數的數字,可以轉換數字成字符
%ns : n個字符串
%ni : 
%N.nf

awk

# awk '條件類型1{動作1} 條件類型2{動作2} ....' filename
$0  整行
$1 第一列
...
# last -n 5 | awk '{print $1 "\t lines:" NR "\t columes: " NF}'
# cat /etc/passwd | awk '{FS=":"} $3<10 {print $1 "\t " $3}'
# cat /etc/passwd | awk '{if(NR==1) printf "%10s",$0} NR>=2{}'

搜索/etc/passwd有root關鍵字的所有行

#awk -F: '/root/' /etc/passwdroot:x:0:0:root:/root:/bin/bash

這種是pattern的使用示例,匹配了pattern(這里是root)的行才會執行action(沒有指定action,默認輸出每行的內容)。
搜索支持正則,例如找root開頭的: awk -F: '/^root/' /etc/passwd
搜索/etc/passwd有root關鍵字的所有行,并顯示對應的shell
# awk -F: '/root/{print $7}' /etc/passwd /bin/bash

變量名稱 代表意義
NF 每一行擁有的字段總數
NR 目前awk所處理的第幾行數據
FS 目前的分隔符,默認是空格鍵

所有awk的動作,即在{}內的動作,如果有需要多個命令輔助時,可以利用分號或者enter來隔開每個命令
awk中變量不需要加$

head tail last

# head -n 3 filename
# tail -n 2 filename
# last 

diff

# diff [-bBi] from-file to-file
from-file和to-file可能是-
-b : 忽略一行當中僅有多個空白的區別
-B :忽略空白行
-i : 忽略大小寫

cmp

# cmp [-s] file1 file2
-s :列出所有不同的點

patch

# patch -pN < patch_file
# patch -R -pN < patch_file

cut

其語法格式為:
cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file]

使用說明
cut 命令從文件的每一行剪切字節、字符和字段并將這些字節、字符和字段寫至標準輸出。如果不指定 File 參數,cut 命令將讀取標準輸入。必須指定 -b、-c 或 -f 標志之一。

主要參數
-b :以字節為單位進行分割。這些字節位置將忽略多字節字符邊界,除非也指定了 -n 標志。
-c :以字符為單位進行分割。
-d :自定義分隔符,默認為制表符。
-f :與-d一起使用,指定顯示哪個區域。
-n :取消分割多字節字符。僅和 -b 標志一起使用。如果字符的最后一個字節落在由 -b 標志的 List 參數指示的<br />范圍之內,該字符將被寫出;否則,該字符將被排除。

pr 文件打印準備

tr

tr [ -c | -cds | -cs | -C | -Cds | -Cs | -ds | -s ] [ -A ] String1 String2
tr { -cd | -cs | -Cd | -Cs | -d | -s } [ -A ] String1

若要將大括號轉換為小括號,請輸入:tr '{}' '()' < textfile > newfile
這便將每個 {轉換成 (,并將每個 }轉換成 )。所有其它的字符都保持不變。
若要將大括號轉換成方括號,請輸入:tr '{}' '\[]' < textfile > newfile
這便將每個 {轉換成 [,并將每個 }轉換成 ]。左方括號必須與一個 "\"轉義字符一起輸入。
若要將小寫字符轉換成大寫,請輸入:tr 'a-z' 'A-Z' < textfile > newfile
若要創建一個文件中的單詞列表,請輸入:
tr -cs '[:lower:][:upper:]' '[\n*]' < textfile > newfile
這便將每一序列的字符(除大、小寫字母外)都轉換成單個換行符。*
(星號)可以使 tr 命令重復換行符足夠多次以使第二個字符串與第一個字符串一樣長。

若要從某個文件中刪除所有空字符,請輸入:tr -d '\0' < textfile > newfile
若要用單獨的換行替換每一序列的一個或多個換行,請輸入:
tr -s '\n' < textfile > newfile
或
tr -s '\012' < textfile > newfile

若要以“?”(問號)替換每個非打印字符(有效控制字符除外),請輸入:tr -c '[:print:][:cntrl:]' '[?*]' < textfile > newfile
這便對不同語言環境中創建的文件進行掃描,以查找當前語言環境下不能打印的字符。
要以單個“#”字符替換 <space> 字符類中的每個字符序列,請輸入:tr -s '[:space:]' '[#*]'

http://www.cnblogs.com/wangkangluo1/archive/2012/05/31/2528059.html

bash 和sed

正則表達式的神坑

sed -r 后面就可以不專一了
如果不接-r,連+和(都需要專一

<<<和< <(這個只有在bash的時候才能用。所以不能用sh去執行。

grep

  1. OR
grep 'Tech\|Sales' employee.txt
grep -E 'pattern1|pattern2' filename
egrep 'pattern1|pattern2' filename
grep -e pattern1 -e pattern2 filename
  1. And
grep -E 'pattern1.*pattern2' filename
grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
grep -E 'pattern1' filename | grep -E 'pattern2'
  1. NOT
grep -v 'pattern1' filename
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容