一塊兒學Shell之(三) 查找與替換

 

#----------------------------------------------------------#html

# ====>  紅色字體 -特指煮酒我的所見。加粗則爲須要重點注意。 #
# ====>  藍色加粗 -特指與本文相關人員,包括參與修正的朋友。 #
# ====> 煮酒品茶 -Http://cwtea.blog.51cto.com          #
#----------------------------------------------------------#

 

 煮酒品茶:學習之中有樂趣固然也有苦悶,特別是剛看正則的時候一下就被轉昏頭了,不過還好,堅持下來了,正則看起來把複雜問題簡單化,其實就能夠解決問題了,sed也是,看了一天,筆記記了大概20來頁,固然不可能全寫上來。只能在筆記上找重點。下面開始吧。python

 
述:正則表達式能夠提供更強大的標記法,以單個表達式匹配各類實際的文本數。
 
grep家族的武器強度。
----------------------------
grep:文本匹配程序
egrep:使用擴展正則表達式,消耗更多的運算資源
fgrep:快速grep,匹配固定字符串而非正則表達式。
-----------------------------
who |grep -F root
注:-F是grep默認的選項,列出單前root登錄的信息,過程就是把who打印出來的信息交給grep,grep查找root的行。而後再打印出來。
grep 選項 文件
用途:顯示一個或多個模式的文本行,一般用於管道|的第一步。具體參數請查找相關資料。
 
煮酒品茶:這個就不用多說了吧,用途大大的,各類查找,與sed awk cut組成強大的陳營。一塊兒學下去確定會獲得更多。下一步找個Shell分析一下。
 
正則表達式:是一種表達方式,讓你能夠查找匹配的特定準則的文本,例如表達以"a字母開頭「匹配多個字符。
 
煮酒品茶:說白了,就是以特定的語言來規定內在的命令,就好像你在北京用家鄉話和老鄉溝通同樣,別人聽不懂的。聽的懂的人就能夠執行相關的命令了。可是搞IT的都喜歡弄些專業的名詞來更好的表述本身的觀點。
 
正則是由兩個基本組成部分創建,通常字符和特殊字符,通常就是沒有意義的字符,特殊就是有特別意義的字符就好像你的家鄉話同樣,又稱 元字符
 
正則支持的命令有:
查找相關:grep egrep agrep 
編輯器:sed 
字符串處理程序:awk icon perl python ruby tcl 
文件查看程序:more page pg less 
文件編輯程序:vi emacs jed jove vile vim等
 
編寫正則表達式的三個步驟:
一、知道要匹配的內容以及它如何出如今文本中。
二、編寫一個模式來描述要匹配的內容。
三、測試模式來查看它的匹配內容
 
正則表達式產生的後果:
Hit命中 
Misses非命中
omissions遺漏
false alarms假命中
 
煮酒品茶:粗俗的來說就是你首先要須要你的需求以及怎麼設計需求,最後預覽一下看是否是和你的須要的同樣。而產生的後果也就只有這麼幾種。能夠根據錯誤往上查。
 
 
 
元字節查看圖
 
------------------------------------------------
 

-------------------------------------------
 
煮酒品茶:看了表以後餘下的就是多練習了,查看時必須先根據前優先級而後再查看,否則真的看暈你。大框架裏包小框架,等下sed裏會有,我多寫一點實例。
 
優先級: 高至低
[....] [: :] 方括號符號
[ ]     方括號表達式
\( \) \digit  子表達式或反向應用
* \ & \ }    前置單個字符發現的正則表達式
無符號     連續
^$           錨點
 
煮酒品茶:你能夠看不懂正則,但必定要記住優先級,否則你查表都無法查。
 
流編輯器Sed
    解釋:shell中處理通常文件替換支持正則表達式與替換文本,任何可顯示的字符均可以做爲定界符,一般以標點符號做爲分界符
 
如 sed 's/a/b/' file 做用是把file文件中的第一個a替換成b 那麼上方的定界符解釋是什麼意思呢?
看這個你就明白了,sed's/a/b/' file 等同於 sed'#s#a#b' file 定界符就是這個意思,這裏得感謝 dn833的指導,在sed中'與"均可以使用,意思就是說sed"s/a/b/' file也可使用。 
 
使用方法:
[address] command
替換:[address] s/pattern/replacement/flags
 
標記flages有:
-n 能夠是1-512,表示第n次出現的替換狀況
g  全局更改,就是所有替換的意思 sed 's/a/b/g' file 後面那個g也就是flages所有替換。
p  打印模式之間的內容
w file 寫入到一個文件file中
 
 
 
 
 
下面有不少的實例:
 
------------------------------------------------
查看文件
[root@localhost sed]# cat file
a a a a a
b b b b bb
b
c c c c c 
c
ddd dd d d d 
d
 
替換第一個'無空格a'爲b
[root@localhost sed]# sed 's/a/b/' file 
b a a a a
b b b b bb
b
c c c c c 
c
ddd dd d d d 
d
 
替換所有的a爲b g表示所有替換
[root@localhost sed]# sed 's/a/b/g' file 
b b b b b
b b b b bb
b
c c c c c 
c
ddd dd d d d 
d
 
替換第一個'空格a'和'空格c',其中;是分隔符
[root@localhost sed]# sed 's/ a/, b/ ; s/ c/,d/' file
a, b a a a
b b b b bb
b
c,d c c c 
c
ddd dd d d d 
d
--------------------------------------------
 
替換' " [ ] \ / .等符號
替換'有點不一樣
-------------------------------------------
[root@localhost sed]# sed 's/'\''/b/g' file
a a a a a
b b b b bb
b
c c c c c 
c
ddd dd d d d 
d
a a aa a
a
b " " " "
" ""
\\\\//[]
b bb bb b b
[root@localhost sed]# 
 
替換其它的[ ]< >等
[root@localhost sed]# sed 's/\[/b/g' file
a a a a a
b b b b bb
b
c c c c c 
c
ddd dd d d d 
d
a a aa a
a
' " " " "
" ""
\\\\//b]
' '' '' ' '
 
[root@localhost ~]# 
 
正則一例:
[root@localhost sed]# cat z
a:b
c:d
e:f
[root@localhost sed]# sed 's/\(.*\):\(.*\)/\2:\1/' z
b:a
d:c
f:e
 
煮酒品茶:如何來看這個正則呢? sed 's/\(.*\):\(.*\)/\2:\1/' z
首先看大框框sed's/?a/?b/' 能夠分爲兩部分了,?a=\(.*\):\(.*\) ?b=\2:\1 這樣是否是就能夠看清了?解釋?a,
\)就是相關的意思,正的變負的負的變正的,因此這裏要這麼理解\(,把通常字符(換成特殊字符,才能組成正則嘛,後面都同樣,  .* 看錶後會發現.是任意一個字符,*是任意多個前面的字符,.*就是任意多個字符,如今看?b \2:\1
前面說了\正的搞成反的,在sed裏2和1都是通常字符,這裏反過來就是特殊字符也就是第一段和第二段,第二段是?a的後面那個.* \1是前面那個.* 因此是否是正好反過來了。看正則先看大框架再看優先級。看的多了就知道看了。
 
冊除空行和帶#號的這一行,我本身寫的,用sed -e也能夠。
[root@localhost sed]# sed '/^$/D' /etc/vsftpd/vsftpd.conf |sed '/\#.*/D'
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
 
煮酒品茶:sed '/^$/D' /etc/vsftpd/vsftpd.conf |sed '/\#.*/D' 再拆唄,sed '//D是冊除的寫法,具體可看sed表。^$ ^是以這個爲開頭,$以這個爲結尾,開頭結尾那就是空行咯,因此空行全冊掉。 後面那個\#.* #無論在sed裏仍是正則裏都沒任何用,因此#.*也能夠,咱們能夠更好的寫^#.*來實現。這個要配置文件中至關重要,別人要看你的配置文件,你給他成百上千的行給別人看?
 
sed -e方式
[root@localhost sed]# sed -e '/^$/D' -e '/\#.*/D' /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
 
把單個數據替換成單個字母,這個可不是全局匹配哇。1和a 2b 3c等進行替換。
[root@localhost sed]# cat number
123456
123654
[root@localhost sed]# sed 'y/123456/abcdef/' number 
abcdef
abcfed
 
冊除::d命令
sed '2d' file 冊除file第二行 
sed '2,$d' file 冊除2到最後那行
sed '$d'  file 冊除最後一行
sed '/test/'d file 冊除file中包含test的行。
sed '/a/b/'d file 冊除a到b中間的行。
更多能夠看:http://www.linuxde.net/2011/12/3381.html萬變不離其宗,你掌握了規則,他再變也就是變下實例,其實吖根本就沒變。
----------------------------------------------
 
 
CUT
解釋:用來剪下文本文件中的數據,能夠是字段類型和字符類型,一個製表字符爲單個字符。
用法:cut -c list [file...]
      cut -f list [-d delim] [file...]
-c 以字符爲主 
-d 定界符
-f 以字符爲主
 
實例:
cut -d: -f 1,5 /etc/passwd   剪掉以:號爲定界符的第1個和第5個而後打印出來,
/etc/passwd文件內容太多了,直接看這個吧。
---------------------------------------
[root@localhost sed]# echo 1:2:a:e:l:6|cut -d: -f 1,4
1:e
root@localhost sed]# 
------------------------------------------------------
 
JOin
解釋:能夠將多個文件結合在一塊兒,每一個文件裏的每條記錄都共享一個健值,健值指的是主字段。
語法:join [options...] file1 file2
 
轉換過程以下:
----------------------------
 
[root@localhost sed]# cat 1
a 1 
b 2
c 4
d 4
[root@localhost sed]# cat 2
a 2
b 4
c 8
d 9
 
[root@localhost sed]# join 1 2
a 1  2
b 2 4
c 4 8
d 4 9
[root@localhost sed]# 
----------------------------------
煮酒品茶:這個合併數據用不錯。積累命令吧,積累多了你就是個寶庫了。
 
 
Awk 
解釋:讀取命令上所指定的各個文件(若無,則標準輸入),一次讀取一條記錄(行)再針對每一行應用程序所指定的命令。
...|awk '{print some-stuff}'|...
 
煮酒品茶:sed和awk是個大話題不可能一下講過,因此原書上只講了一部分,在後面有單獨講這個的。
 
awk '{print $1}' 打印第一個程序
awk '{print $1,$5}' 打印2-5個字段
awk '{print $1,$NFS}' 打印1到最後  這個打印出來沒回車
awk 'NF>0 {print $0}' 打印1到最後 這個打印可來有回車
 
 
awk -F: '{print $1,$5}' 以:爲定界符打印第一個字段和第五個字段。是否是和cut同樣,咱們試下吧。
-----------------------------
[root@localhost sed]# echo "a:b:c:d:e:f" |awk -F: '{print $1,$4}'
a d
[root@localhost sed]# echo "a:b:c:d:e:f" |cut -d: -f 1,4
a:d
---------------------------------
煮酒品茶:基本沒區別,可是中間有個:號,下面也會講到的。
 
awk -F: -v'OFS=**' 'print $1,$4' file 這個是以**爲來作分隔符啦,咱們再試下。
---------------------------
[root@localhost sed]# echo "a:b:c:d:e:f" |awk -F: -v 'OFS=:' '{print $1,$4}' 
a:d
[root@localhost sed]# 
--------------------------------------
煮酒品茶:注意OFS=:'後面要加個空格,和'{分開。
 
 
總結一下:筆記內容有, sed 正則 awk cut join 慢慢消化,多看實例,下回找個Shell來分析下。
相關文章
相關標籤/搜索