一、整理正則表達式博客
(1)正則
正則就是用一些具有特殊含義的符號組合到一起(稱為正則表達式)來描述字符或者字符串的方法。或者說:正則就是用來描述一類事物的規則。
在linux中,通配符是由shell解釋的,而正則表達式則是由命令解釋的,下面我們就為大家介紹三種文本處理工具/命令:grep、sed、awk,它們三者均可以解釋正則。
正則介紹:
^行首 $行尾 .除了換行符以外的任意單個字符 .*所有字符 *:左邊的那一個字符有0個到無窮個 +:左邊的那一個字符有1個到無窮個 ?:左邊的那一個字符有0個到1個 {n}:左邊的那一個字符有n個 {n,m}:左邊的那一個字符有n個到m個 {n,}:左邊的那一個字符有n個到無窮個
[]字符組內的任一字符 [^]對字符組內的每個字符取反(不匹配字符組內的每個字符) ^[^]非字符組內的字符開頭的行 [a-z]:所有的小寫字母 [A-Z]:所有的大寫字母 [a-zA-Z]:所有的大小寫字母,等於[a-Z] [0-9]:數字 \<單詞頭 單詞一般以空格或特殊字符做分隔,連續的字符串被當做單詞 \>單詞尾 注意的一點是:如果要匹配的字符就是-本身話,必須放到最后去[123123\-]
擴展正則sed 加 -r參數或轉義 grep 加-E或egrep或轉義 awk直接支持,但不包含{n,m} 可以使用--posix支持 awk '/ro{1,3}/{print}' /etc/passwd awk --posix '/ro{1,3}/{print}' /etc/passwd sed -n '/roo\?/p' /etc/passwd sed -rn '/roo?/p' /etc/passwd ?前導字符零個或一個 +前導字符一個或多個 abc|def abc或def a(bc|de)f abcf或adef x\{m\}x出現m次 x\{m,\}x出現m次至多次(至少m次) x\{m,n\}x出現m次至n次
(2)grep
參數
-n :顯示行號 -o :只顯示匹配的內容 -q :靜默模式,沒有任何輸出,得用$?來判斷執行成功沒有,即有沒有過濾到想要的內容 -l :如果匹配成功,則只將文件名打印出來,失敗則不打印,通常-rl一起用,grep -rl 'root' /etc -A :如果匹配成功,則將匹配行及其后n行一起打印出來 -B :如果匹配成功,則將匹配行及其前n行一起打印出來 -C :如果匹配成功,則將匹配行及其前后n行一起打印出來 --color -c :如果匹配成功,則將匹配到的行數打印出來 -E :等於egrep,擴展 -i :忽略大小寫 -v :取反,不匹配 -w:匹配單詞
(3)sed
sed 選項參數 命令
例如: #sed -n '3p' test.txt #靜默輸出第3行內容,3為定位行位置,p為命令 #sed ‘4a abcd’ test.txt #第4行追加abcd字符,a為命令
其中,
選項參數:
-n:靜默處理,不打印輸出結果
命令:
p:打印 c:替換行內容 a:追加內容 i:插入內容 1,4d:刪除1到4行內容 1d,4d:刪除1行和4行內容 d:刪除 //:命令中使用正則表達式放入//中 //d:刪除正則匹配到的行 s:替換 s/aaa/bbb/g:將全部行中的aaa替換為bbb,不加g則每行只替換第一個aaa s/()()/\1\2/g:匹配兩個括號中的內容,\1\2表示將第一個括號和第二個括號內容顯示 例如: #sed 's/^(.)(.*)$/\2/' test.txt #test文件中任意行去掉第一個字符,^(.)任意單字符開始,(.*)任意0到無窮字符,\2只顯示第二個括號部分
二、grep(正則表達式及字符處理)
目標文件/etc/passwd,使用grep命令或egrep
1.顯示出所有含有root的行:
2.輸出任何包含bash的所有行,還要輸出緊接着這行的上下各兩行的內容:
3. 顯示出有多少行含有nologin。
4.顯示出那些行含有root,並將行號一塊輸出。
5.新建用戶
abominable
abominate
anomie
atomize
編寫正則表達式,將他們匹配出來
(.除了換行符以外的任意單個字符)
刪除用戶:
或者使用userdel
6.建四個用戶
Alex213sb
Wpq2222b
yH438PIG
egon666
egon
過濾出用戶名組成是字母+數字+字母的行
7.顯示出/etc目錄下所有包含root的文件名
(-o顯示)
8. 過濾掉/etc/ssh/sshd_config內所有注釋和所有空行
作業三:Sed作業:以/etc/passwd文件為模板
1,刪除文件每行的第一個字符。
sed -r 's/^(.)(.*)/\2/' etc/passwd
2,刪除文件每行的第二個字符。
sed -r 's/^(.)(.)(.*)/\1\3/' /etc/passwd
3,刪除文件每行的最后一個字符。
sed -r 's/(.*)(.)$/\1/' /etc/passwd
4,刪除文件每行的倒數第二個字符。
sed -r 's/(.*)(.)(.)$/\1\3/' /etc/passwd
5,刪除文件每行的第二個單詞。
sed -r 's/^([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/\1\2\4/' /etc/passwd
6,刪除文件每行的倒數第二個單詞。
sed -r 's/([a-Z]+)([^a-Z]+)([a-Z]+)$/\2\3/' /etc/passwd
7,刪除文件每行的最后一個單詞。
sed -r 's/([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)$/\1\2\3/' /etc/passwd
8,交換每行的第一個字符和最后一個字符。
sed -r 's/^(.)(.*)(.)$/\3\2\1/' /etc/passwd
9,交換每行的第一個字符和第二個單詞。
sed -r 's/^(.)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/\4\2\3\1\5/' /etc/passwd
10,交換每行的第一個單詞和最后一個單詞。
sed -r 's/^([a-Z]+)([^a-Z]+)(.*)([^a-Z]+)([a-Z]+)$/\5\2\3\4\1/' /etc/passwd
11,刪除一個文件中所有的數字。
sed -r 's/[0-9]//g' /etc/passwd
12,刪除每行開頭的所有空格。
sed -r 's/^ *//g' /etc/passwd
13,用制表符替換文件中出現的所有空格。
sed -r 's/ /\t/g' /etc/passwd
14,把所有大寫字母用括號()括起來。
sed -r 's/[A-Z]/(&)/g' /etc/passwd
15,打印每行3次。
sed 'p;p' /etc/passwd
16,只顯示每行的第一個單詞。
sed -r 's/^([a-Z]+)([^a-Z]+)(.*)/\1/' /etc/passwd
17,打印每行的第一個單詞和第三個單詞。
sed -r 's/^([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/\5\2\3\4\1\6/' /etc/passwd
18,用命令獲取格式為 mm/yy/dd 的日期格式,結合管道,將其換成 mm;yy;dd格式