awk、grep、sed是linux操作文本的三大利器,合稱文本三劍客。
特點(diǎn):
grep——單純的查找或匹配文本。
sed——編輯匹配到的文本。
awk——格式化文本,對(duì)文本進(jìn)行較復(fù)雜格式處理。
首先了解一下正則表達(dá)式:
匹配字符
. 任意單個(gè)字符
[] 指定范圍的字符
[^] 不在指定范圍的字符
次數(shù)匹配:
* :匹配前面字符任意次
? : 0 或1次
+ :1 次或多次
{m} :匹配m次 次
{m,n} :至少m ,至多n次
?配置次數(shù)
* 匹配前面的字符任意次,包括0次,貪婪模式:盡可能長(zhǎng)的匹配
.* 任意前面長(zhǎng)度的任意字符,不包括0次
\? 匹配其前面的字符0 或 1次
+ 匹配其前面的字符至少1次
{n} 匹配前面的字符n次
{m,n} 匹配前面的字符至少m 次,至多n次
{,n} 匹配前面的字符至多n次
{n,} 匹配前面的字符至少n次
?位置錨定:定位出現(xiàn)的位置
^ : 行首
$ : 行尾
<, \b : 語(yǔ)首
>, \b : 語(yǔ)尾
分組:()
后向引用:\1, \2, ...
?
實(shí)例介紹:
grep
Linux系統(tǒng)中g(shù)rep命令是一種強(qiáng)大的文本搜索工具,它能使用正則表達(dá)式搜索文本,并把匹配的行打印出來(lái) 。grep也可用于shell腳本,因?yàn)間rep通過(guò)返回一個(gè)狀態(tài)值來(lái)說(shuō)明搜索的狀態(tài),如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2。
語(yǔ)法:
grep [options] [pattern] file
命令 參數(shù) 匹配模式 文件數(shù)據(jù)
-i : Linux大小寫(xiě)敏感,忽略字符大小寫(xiě)
-o : 僅顯示匹配的字符串本身
-v : 顯示沒(méi)有被匹配的行
-E :支持使用擴(kuò)展的正則表達(dá)式元字符
-q : 靜默模式,不輸出任何信息
-n : 顯示行號(hào)
-F : 相當(dāng)于fgrep,匹配固定字符串的內(nèi)容。
fgrep : 為固定字符串全局正則表達(dá)式打印fgrep(與grep -F相同)是固定的或快速的grep,其行為與grep相同,但不會(huì)將任何正則表達(dá)式元字符識(shí)別為特殊的。搜索將更快完成,因?yàn)樗惶幚砗?jiǎn)單的字符串而不是復(fù)雜的模式。
實(shí)例:
1. grep '^a' test.txt -i -n #查找以a開(kāi)頭的行,顯示行號(hào)并且忽略大小寫(xiě)。
'a$' #查找以a結(jié)尾的行
'a*' #查找a出現(xiàn)一次或者多次行號(hào)
2. grep -v '^$' test.txt #反向輸出所有非空格內(nèi)容(過(guò)濾空行)
3. grep "\.$" test.txt -n #輸出以.為結(jié)束的行,\為轉(zhuǎn)義字符,.為特殊字符。
'^.*c' #以任意內(nèi)容開(kāi)頭, 直到c結(jié)束
4. grep "[abc]" test.txt -n -o #匹配abc字符中的任意一個(gè),得到它的行數(shù)和行號(hào),只顯示被匹配的關(guān)鍵字。
"[^a]" -c #匹配除a以外的字符,顯示被匹配了多少行。
"[a+]" -n #+號(hào)表示匹配前一個(gè)字符1一次或多次.
"[go?d]" -n #匹配god或者good
5. grep -E "(ab)+c" test.txt -n #匹配ab出現(xiàn)一次或者多次以c結(jié)尾的行,并顯示行號(hào)。
"go(|o|od)d" #|或的意思,()將一個(gè)或多個(gè)字符捆綁一起, 當(dāng)作一個(gè)整體進(jìn)行處理。
"(ab){1,3}" #匹配ab字符一到三次。
sed
sed 是一種流編輯器,它一次處理一行內(nèi)容。
? 處理時(shí),把當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū)中,稱為“模式空間”(patternspace ),
? 接著用sed 命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕。
? 然后讀入下行,執(zhí)行下一個(gè)循環(huán)。
? 如果沒(méi)有使諸如‘D’ 的特殊命令,那會(huì)在兩個(gè)循環(huán)之間清空模式空間,但不會(huì)清空保留空間。
? 這樣不斷重復(fù),直到文件末尾。
? 文件內(nèi)容并沒(méi)有改變,除非你使用重定向存儲(chǔ)輸出或-i。
? 功能:主要用來(lái)自動(dòng)編輯一個(gè)或多個(gè)文件, 簡(jiǎn)化對(duì)文件的反復(fù)操作
?語(yǔ)法: sed` `[options] ``'[地址定界] command'` `file``(s)
?常用的option:
-n :不輸出模式空間內(nèi)容到屏幕,即不自動(dòng)打印,只打印匹配到的行
-e :多點(diǎn)編輯,對(duì)每行處理時(shí),可以有多個(gè)Script
-f :把Script寫(xiě)到文件當(dāng)中,在執(zhí)行sed時(shí)-f 指定文件路徑,如果是多個(gè)Script,換行寫(xiě)
-r :支持?jǐn)U展的正則表達(dá)式
-i :直接將處理的結(jié)果寫(xiě)入文件
-i.bak :在將處理的結(jié)果寫(xiě)入文件之前備份一份
地址定界:
不給地址:對(duì)全文進(jìn)行處理
單地址:
\#: 指定的行
/pattern/:被此處模式所能夠匹配到的每一行
地址范圍:
\#,#
\#,+#
/pat1/,/pat2/
\#,/pat1/
~:步進(jìn)
sed -n '1~2p' 只打印奇數(shù)行 (1~2 從第1行,一次加2行)
sed -n '2~2p' 只打印偶數(shù)行
command:
d:刪除模式空間匹配的行,并立即啟用下一輪循環(huán)
p:打印當(dāng)前模式空間內(nèi)容,追加到默認(rèn)輸出之后
a:在指定行后面追加文本,支持使用\n實(shí)現(xiàn)多行追加
i:在行前面插入文本,支持使用\n實(shí)現(xiàn)多行追加
c:替換行為單行或多行文本,支持使用\n實(shí)現(xiàn)多行追加
w:保存模式匹配的行至指定文件
r:讀取指定文件的文本至模式空間中匹配到的行后
=:為模式空間中的行打印行號(hào)
!:模式空間中匹配行取反處理
加g表示行內(nèi)全局替換;
在替換時(shí),可以加一下命令,實(shí)現(xiàn)大小寫(xiě)轉(zhuǎn)換
\l:把下個(gè)字符轉(zhuǎn)換成小寫(xiě)。
\L:把replacement字母轉(zhuǎn)換成小寫(xiě),直到\U或\E出現(xiàn)。
\u:把下個(gè)字符轉(zhuǎn)換成大寫(xiě)。
\U:把replacement字母轉(zhuǎn)換成大寫(xiě),直到\L或\E出現(xiàn)。
\E:停止以\L或\U開(kāi)始的大小寫(xiě)轉(zhuǎn)換
實(shí)例:
1. sed -n '5,19 p' demo #查看文件demo中5-19行中的內(nèi)容。
2. sed -n '/^a/ p' demo #查看以a開(kāi)頭的demo文件的行。
3. sed '2,3 d' demo | head #將2-5行內(nèi)容打印出來(lái)。
4. sed -e '4 a\abc' demo | head #在文件passwd上的第四行后面添加abc.
5. sed '2 i\abc' demo | head #在第二行前插入abc.
6. sed '3 c\abc' demo |head #將第三行替換為abc.
7. sed -n '5,10 s/bin/aaaa/ p' demo |head #將passwd的5到10的bin字符串查找出來(lái)替換為aaaa。
8. sed -i '1 d' demo #刪除原文件的第一行。
9. sed -i.bak '1 d' demo #備份
awk
awk是一種編程語(yǔ)言,用于在linux/unix下對(duì)文本和數(shù)據(jù)進(jìn)行處理。
數(shù)據(jù)可以來(lái)自標(biāo)準(zhǔn)輸入(stdin)、一個(gè)或多個(gè)文件,或其它命令的輸出。
它支持用戶自定義函數(shù)和動(dòng)態(tài)正則表達(dá)式等先進(jìn)功能,是linux/unix下的一個(gè)強(qiáng)大編程工具。
awk有很多內(nèi)建的功能,比如數(shù)組、函數(shù)等,這是它和C語(yǔ)言的相同之處,靈活性是awk最大的優(yōu)勢(shì)。
語(yǔ)法:
awk ‘BEGIN {commands} pattern {commands}END{commands}' file1
BEGIN:處理數(shù)據(jù)前執(zhí)行的命令
END:處理數(shù)據(jù)后執(zhí)行的命令
pattern:模式,每一行都執(zhí)行的命令
BEGIN和END里的命令只是執(zhí)行一次
pattern里的命令會(huì)匹配每一行去處理
awk -F: 'BEGIN{print "第一列"}{print $1} END{print "結(jié)束"}' awkdemo
第一列
a
b
c
結(jié)束
示例:
1. awk -F ":" '{print $1,$2,$5}' /etc/passwd | head
-F ":" : awk選項(xiàng),指定輸入分割符為:
'{print}' : 固定語(yǔ)法
$1,$2,$5 :輸出第一個(gè),第二個(gè),第五個(gè)字段
: 是輸出分隔符,如果不加默認(rèn)是沒(méi)有分隔符的。
2. echo 'this is a test' | awk '{print $0}'
this is a test
3. echo 'this is a test' | awk '{print $NF}'
test #$NF表示最后一個(gè)字段,$(NF-1)表示倒數(shù)第二個(gè)字段。
4. cat awkdemo
a:b
c:d
awk -v FS=':' '{print $1,$2}' demo #FS指定輸入分隔符
a b
c d
5. awk -v FS=':' -v OFS='---' '{print $1,$2}' demo #OFS指定輸出分隔符
a---b
c---d
6. awk -v RS=':' '{print $1,$2}' demo
a
b c
d
7. awk -v FS=':' -v ORS='---' '{print $1,$2}' demo
a b---c d
8. awk '{print FILENAME}' demo1
demo1
9. awk 'BEGIN {print ARGC}' demo
2
10. awk 'BEGIN {print ARGV[0]}' demo1
awk
awk 'BEGIN {print ARGV[1]}' demo1
demo1
內(nèi)置變量
FS :輸入字段分隔符,默認(rèn)為空白字符
OFS :輸出字段分隔符,默認(rèn)為空白字符
RS :輸入記錄分隔符,指定輸入時(shí)的換行符,原換行符仍有效
ORS :輸出記錄分隔符,輸出時(shí)用指定符號(hào)代替換行符
NF :字段數(shù)量,共有多少字段, $NF引用最后一列,$(NF-1)引用倒數(shù)第2列
NR :行號(hào),后可跟多個(gè)文件,第二個(gè)文件行號(hào)繼續(xù)從第一個(gè)文件最后行號(hào)開(kāi)始
FNR :各文件分別計(jì)數(shù), 行號(hào),后跟一個(gè)文件和NR一樣,跟多個(gè)文件,第二個(gè)文件行號(hào)從1開(kāi)始
FILENAME :當(dāng)前文件名
ARGC :命令行參數(shù)的個(gè)數(shù)
ARGV :數(shù)組,保存的是命令行所給定的各參數(shù),查看參數(shù)
自定義變量:-v var=value
awk -v name="mmm" -F: '{print name":"$0}' demo
mmm:a:b
mmm:c:d
內(nèi)置函數(shù),方便對(duì)原始數(shù)據(jù)的處理。
$ awk -F ':' '{ print toupper($1) }' demo.txt
?
tolower()
:字符轉(zhuǎn)為小寫(xiě)。
length()
:返回字符串長(zhǎng)度。
substr()
:返回子字符串。
sin()
:正弦。
cos()
:余弦。
sqrt()
:平方根。
rand()
:隨機(jī)數(shù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-853073.html
awk -F ':' '/usr/ {print $1}' demo.txt
#print命令前面是一個(gè)正則表達(dá)式,只輸出包含usr的行。
awk -F ':' 'NR % 2 == 1 {print $1}' demo.txt
#輸出奇數(shù)行
awk -F ':' 'NR >3 {print $1}' demo.txt
#輸出第三行后的行
awk -F ':' '$1 == "root" {print $1}' demo.txt
?
awk -F ':' '$1 == "root" || $1 == "bin" {print $1}' demo.txt
#輸出第一個(gè)字段等于指定值的行。
awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo.txt
#使用if語(yǔ)句
操作符:
1. df -h |awk -F: '$0 ~ /^\/dev/' /dev/mapper/cl-root
#查詢以/dev開(kāi)頭的磁盤(pán)信息
模式匹配符:~ :左邊是否和右邊匹配包含
!~ :是否不匹配
2. awk -F: '$3>=0 && $3<=10 {print $1,$3}' /aaa
3. awk -F: '$3==0 || $3>=10 {print $1}' /aaa
其他操作符
1.算術(shù)操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x: 轉(zhuǎn)換為負(fù)數(shù)
+x: 轉(zhuǎn)換為數(shù)值
2.賦值操作符:
=, +=, -=, *=, /=, %=, ^=, ++, --
3.比較操作符:
==, !=, >, >=, <, <=
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-853073.html
到了這里,關(guān)于linux文本三劍客詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!