国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux三劍客grep、sed、awk(包括練習(xí)題)

這篇具有很好參考價值的文章主要介紹了Linux三劍客grep、sed、awk(包括練習(xí)題)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Linux grep、sed、awk(包含練習(xí)題)

一、grep

Linux grep (global regular expression) 命令用于查找文件里符合條件的字符串或正則表達(dá)式。

  1. 基本用法與常見的正則表達(dá)式
grep [options] pattern [files]
命令 	參數(shù)	   匹配模式	文件數(shù)據(jù)
	-i:忽略大小寫進(jìn)行匹配。
	-v:反向查找,只打印不匹配的行。
	-n:顯示匹配行的行號。
	-E 或 --extended-regexp : 將樣式為延伸的正則表達(dá)式來使用。
	-q 或 --quiet或--silent : 不顯示任何信息。
	-o 或 --only-matching : 只顯示匹配PATTERN 部分。

`找到mysql有關(guān)的行并顯示行號`
[root@localhost /]# grep "mysql" /tmp/passwd.txt -n
49:mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin

`找到MYSQL有關(guān)的行不區(qū)分大小寫`
[root@localhost /]# grep "MYSQL" /tmp/passwd.txt -i
49:mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin

`找到不是mysql有關(guān)的行`
[root@localhost /]# grep  "mysql" /tmp/passwd.txt -v
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

`統(tǒng)計還有root行的行數(shù)`
[root@localhost /]# grep  "root" /tmp/passwd.txt -c
2

---^符號 錨定行的開始 如:'^grep'匹配所有以grep開頭的行
`^ 以什么開頭`
`找到m開頭的行 不區(qū)分大小寫`
[root@localhost /]# grep  '^m' /tmp/luffy.txt -i
My qq is 877348180.
My name is chaoge.

---$符號 錨定行的結(jié)束 如:'grep$'匹配所有以grep結(jié)尾的行
`$ 以什么開結(jié)尾`
[root@localhost /]# grep  'oldboy$' /tmp/luffy.txt -i
I am oldboy

`找到luffy.txt文件中的空行   '^$'以空開頭 以空結(jié)尾`
[root@localhost /]# grep  '^$' /tmp/luffy.txt -n
3:
5:

`找到luffy.txt文件中的非空行`
[root@localhost /]# grep  '^$' /tmp/luffy.txt -v
I am oldboy
I like linux.
My name is xuxuxu
#Our school website is http://xixixi.com

`找到luffy.txt文件中的非空非注釋行`
[root@localhost /]# grep  '^$|^#' /tmp/luffy.txt -Ev
I am oldboy
I teach linux.
I like python.
My qq is 877348180.
My name is chaoge.

---.符號 表示任意一個字符,有且只有一個,不包含空行
`"."點表示任意一個字符,有且只有一個,不包含空行`
'匹配出".ac",找出任意一個兩位字符,包含s'
[root@localhost /]# grep  '.s' /tmp/luffy.txt 
My qq is 877348180.
My name is chaoge.
Our school website is http:/loldboyedu.com

`找到以.結(jié)尾的行 直接寫.$會被當(dāng)做任意字符 用\進(jìn)行轉(zhuǎn)義`
[root@localhost /]# grep  '\.$' /tmp/luffy.txt -i
I teach linux.
I like python.
My qq is 877348180.
My name is chaoge.

[root@localhost /]# grep  '/bin/bash$' /tmp/passwd.txt -n
1:root:x:0:0:root:/root:/bin/bash
44:test:x:1000:1000:test:/home/test:/bin/bash
45:xiaosang:x:1001:1001::/home/xiaosang:/bin/bash
46:biaosang:x:1002:1002::/home/biaosang:/bin/bash

`找到passwd.txt文件中以/bin/bash結(jié)尾的行,且只顯示找到的/bin/bash本身`
[root@localhost /]# grep  '/bin/bash$' /tmp/passwd.txt -n -o
1:/bin/bash
44:/bin/bash
45:/bin/bash
46:/bin/bash

---*符號 匹配零個或多個先前字符如:'*grep'匹配所有一個或多個空格后緊跟grep的行
[root@localhost /]# grep  'boy*' /tmp/luffy.txt 
I am oldboy
#Our school website is http:/loldboyedu.com

`貪婪匹配`
[root@localhost /]# grep  '.*e' /tmp/luffy.txt  -o
I te
I like
My name is chaoge
Our school website is http:/loldboye

---[]符號 匹配一個指定范圍內(nèi)的字符,如'[Gg]rep'匹配Grep和grep
[root@localhost /]# grep [ib]s /tmp/luffy.txt
My qq is 877348180.
My name is chaoge.
Our school website is http:/loldboyedu.com

[root@localhost /]# grep [a-z] /tmp/luffy.txt
I am oldboy
I teach linux.
I like python.
My qq is 877348180.
My name is chaoge.
Our school website is http:/loldboyedu.com

---[^]符號 匹配一個不在指定范圍內(nèi)的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行
  1. 擴展正則表達(dá)式實踐

    此處使用grep -E 進(jìn)行實踐擴展正則,egrep官網(wǎng)已經(jīng)棄用

+符號
`+號表示匹配前一個字符1次或多次,必須使用grep -E 擴展正則`
[root@localhost /]# grep  'l+' /tmp/luffy.txt -E
I am oldboy
I teach linux.
I like python.
Our school website is http:/loldboyedu.com

?符號
`匹配前一個字符0次或1次`
`找到文件中包含gd或god的行`
[root@localhost /]# grep 'go?d' /tmp/test.txt -E
gd
god

|符號 在正則中表示或者的意思
`找到/tmp中txt文件,且名字里包含a或b的字符`
[root@localhost /]# find /tmp -name "*.txt" | grep -E "a|b"
/tmp/passwd.txt
/tmp/my_crontab.txt

()符號
`將一個或多個字符捆綁在一起,當(dāng)作一個整體進(jìn)行處理`
[root@localhost /]# grep -E 'g(oo|al)d' /tmp/test.txt 
good
gald

a{n,m}匹配a的次數(shù)
`重復(fù)前一個字符各種次數(shù),可以通過-o參數(shù)顯示明確的匹配過程`
[root@localhost /]# grep -E "x{2,4}" /tmp/xuxu.txt 
xxxxxxxuuuuuu
xxxxuuuu
xxuu

[root@localhost /]# grep -E "x{2,4}" /tmp/xuxu.txt -o
xxxx
xxx
xxxx
xx

`最多匹配4次`
[root@localhost /]# grep -E "x{,4}" /tmp/xuxu.txt
xxxxxxxuuuuuu
xxxxuuuu
xu
xxuu

`最少匹配4次`
[root@localhost /]# grep -E "x{4,}" /tmp/xuxu.txt
xxxxxxxuuuuuu
xxxxuuuu

二、sed

注意:sed和awk使用單引號,雙引號有特殊解釋

sed是Stream Editor(字符流編輯器)的縮寫,簡稱流編輯器

sed是一種流編輯器,它一次處理一行內(nèi)容。處理時,把當(dāng)前處理的行存儲在臨時緩沖區(qū)中,稱為“模式空間”,接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕。接著處理下一行,這樣不斷重復(fù),直到文件末尾。文件內(nèi)容并沒有改變,除非你使用重定向存儲輸出。

  1. 基本語法
sed [options] '{command}[flags]' filename    
	命令選項	內(nèi)部選項和參數(shù)		文件
命令選項
-e script 將腳本中指定的命令添加到處理輸入時執(zhí)行的命令中,  多條件,一行中要有多個操作
-f script 將文件中指定的命令添加到處理輸入時執(zhí)行的命令中
-n		 僅顯示script處理后的結(jié)果
-i        編輯文件內(nèi)容
-i.bak    修改時同時創(chuàng)建.bak備份文件。
-r        使用擴展的正則表達(dá)式
!         取反 (跟在模式條件后與shell有所區(qū)別)

sed常用內(nèi)部命令
a   在匹配后面添加
i   在匹配前面添加
p   打印
d   刪除
s   查找替換
c   更改
y   轉(zhuǎn)換   N D P 

flags
數(shù)字             表示新文本替換的模式
g:             表示用新文本替換現(xiàn)有文本的全部實例
p:             表示打印原始的內(nèi)容
w filename:     將替換的結(jié)果寫入文件

空地址 全文匹配
單地址 指定文件某一行
/pattern/	被模式匹配的每一行
范圍區(qū)間 	10,20 十到二十行 10,+5第10行向下5行,/pattern1/,/pattern2/
步長	1~2,表示1,3,5,7,9行,2~2表示2,4,6,8,10偶數(shù)行
  1. 基本用法
`打印第2、3行`
[root@localhost /]# sed "2,3p" /tmp/luffy.txt -n
I teach linux.
I like python.

`打印第一行和下面3行`
[root@localhost /]# sed "1,+3p" /tmp/luffy.txt -n
I am oldboy
I teach linux.
I like python.
I like linux.

`找出有l(wèi)inux的行并打印`
[root@localhost /]# sed "/linux/p" /tmp/luffy.txt -n
I teach linux.
I like linux.

`刪除第5行至末尾行的內(nèi)容`
[root@localhost ~]# sed '5,$d' /tmp/luffy2.txt -i

`s///替換 g表示全局替換`
[root@localhost ~]# sed 's/linux/java/g' /tmp/luffy2.txt -i
[root@localhost ~]# cat /tmp/luffy2.txt 
I teach java.
I like python.

`多次替換`
[root@localhost ~]# sed -e 's/java/linux/g' -e 's/python/c++/g' /tmp/luffy2.txt -i
[root@localhost ~]# cat /tmp/luffy2.txt 
I teach linux.
I like c++.

`在文件第二行后追加一行`
[root@localhost ~]# sed '2a good good study' /tmp/luffy2.txt -i
[root@localhost ~]# cat /tmp/luffy2.txt 
I teach linux.
I like c++.
good good study

`在第三行前插入一行`
[root@localhost ~]# sed '3i happy every day' /tmp/luffy2.txt -i
[root@localhost ~]# cat /tmp/luffy2.txt 
I teach linux.
I like c++.
happy every day
good good study

`在每一行加上分隔符`
[root@localhost ~]# sed 'a -------------' /tmp/luffy2.txt -i
[root@localhost ~]# cat /tmp/luffy2.txt 
I teach linux.
-------------
I like c++.
-------------
happy every day
-------------
good good study
-------------

-------------

-------------

`雙斜線正則匹配 配合d刪除`
[root@localhost ~]# sed -e '/^$/d' -e '/^#/d' /tmp/luffy2.txt 
I teach linux.
I like c++.
happy every day
good good study
[root@localhost ~]# sed  '/^$/d;/^#/d' /tmp/luffy2.txt 
I teach linux.
I like c++.
happy every day
good good study


`取出linux的ip地址`  
[root@localhost ~]#  ifconfig ens33 | sed '2p' -n | sed 's/^.*inet//' | sed 's/net.*$//'
192.168.70.14  

[root@localhost ~]# ifconfig ens33 | sed -e "2s/^.*inet//" -n  -e "2s/net.*$//p" 
192.168.70.14  

三、awk

AWK 是一種處理文本文件的語言,是一個強大的文本分析工具。

之所以叫 AWK 是因為其取了三位創(chuàng)始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

1,主要的作用:

用來處理文本,將文本按照指定的格式輸出。其中包含了變量,循環(huán)以及數(shù)組。

2,語法

awk [option] 'pattern[action]' file ...

awk 參數(shù) ‘條件動作’ 文件

Action指的是動作,awk擅長文本格式化,且輸出格式化后的結(jié)果,因此最常用的動作就是print 和 printf

3, action動作場景

  • $0表示整行
  • $NF表示當(dāng)前分割后的最后一列
  • 倒數(shù)第二列可以寫成$(NF-1)
`打印所有列`
[root@localhost ~]# awk '{print $0}' /tmp/awktest.txt
xux1 xux2 xux3 xux4 xux5 
xux6 xux7 xux8 xux9 xux10 
xux11 xux12 xux13 xux14 xux15 
xux16 xux17 xux18 xux19 xux20 
xux21 xux22 xux23 xux24 xux25 
xux26 xux27 xux28 xux29 xux30 
xux31 xux32 xux33 xux34 xux35 
xux36 xux37 xux38 xux39 xux40 
xux41 xux42 xux43 xux44 xux45 
xux46 xux47 xux48 xux49 xux50

`打印第一列`
[root@localhost ~]# awk '{print $1}' /tmp/awktest.txt 
xux1
xux6
xux11
xux16
xux21
xux26
xux31
xux36
xux41
xux46

4,內(nèi)置變量

NR 表示當(dāng)前文件的行數(shù)
NF 表示當(dāng)前文件有幾列
FS 表示當(dāng)前的列分隔符
RS 表示當(dāng)前的行分隔符
OFS 輸出字段分隔符
ORS 輸出記錄分隔符

[root@localhost ~]# awk 'NR==5{print $0}' /tmp/awktest.txt 
xux21 xux22 xux23 xux24 xux25 

[root@localhost ~]# awk 'NR==5, NR ==6{print $0}' /tmp/awktest.txt 
xux21 xux22 xux23 xux24 xux25 
xux26 xux27 xux28 xux29 xux30 

`打印第1-3行所有列`
[root@localhost ~]# awk 'NR==1,NR ==3{print $0}' /tmp/awktest.txt 
xux1 xux2 xux3 xux4 xux5 
xux6 xux7 xux8 xux9 xux10 
xux11 xux12 xux13 xux14 xux15

`打印行號NR`
[root@localhost ~]# awk '{print NR,$0}' /tmp/awktest.txt 
1 xux1 xux2 xux3 xux4 xux5 
2 xux6 xux7 xux8 xux9 xux10 
3 xux11 xux12 xux13 xux14 xux15 
4 xux16 xux17 xux18 xux19 xux20 
5 xux21 xux22 xux23 xux24 xux25 
6 xux26 xux27 xux28 xux29 xux30 
7 xux31 xux32 xux33 xux34 xux35 
8 xux36 xux37 xux38 xux39 xux40 
9 xux41 xux42 xux43 xux44 xux45 
10 xux46 xux47 xux48 xux49 xux50

[root@localhost ~]# awk '{print $(NF-2),$(NF-1),$NF}' /tmp/awktest.txt 
xux3 xux4 xux5
xux8 xux9 xux10
xux13 xux14 xux15
xux18 xux19 xux20
xux23 xux24 xux25
xux28 xux29 xux30
xux33 xux34 xux35
xux38 xux39 xux40
xux43 xux44 xux45
xux48 xux49 xux50

`ip地址`
[root@localhost ~]# ifconfig ens33 | awk 'NR==2{print $2}'
192.168.70.14

5, 自定義輸出

? 注意:awk,必須 外層單引號,內(nèi)層雙引號

? 內(nèi)置變量 $1、$2 都不得添加雙引號,否則會識別為文本,盡量別加引號

`使用逗號默認(rèn)空格分隔`
[root@localhost ~]#  awk '{print $1,$3,$5}' /tmp/awktest.txt  
xux1 xux3 xux5
xux6 xux8 xux10
xux11 xux13 xux15
xux16 xux18 xux20
xux21 xux23 xux25
xux26 xux28 xux30
xux31 xux33 xux35
xux36 xux38 xux40
xux41 xux43 xux45
xux46 xux48 xux50

[root@localhost ~]#  awk '{print "n1: "$1,"n2: "$3,"n3: "$5}' /tmp/awktest.txt 
n1: xux1 n2: xux3 n3: xux5
n1: xux6 n2: xux8 n3: xux10
n1: xux11 n2: xux13 n3: xux15
n1: xux16 n2: xux18 n3: xux20
n1: xux21 n2: xux23 n3: xux25
n1: xux26 n2: xux28 n3: xux30
n1: xux31 n2: xux33 n3: xux35
n1: xux36 n2: xux38 n3: xux40
n1: xux41 n2: xux43 n3: xux45
n1: xux46 n2: xux48 n3: xux50

6, 功能性參數(shù)

-F 指定分割字段符
-v 定義或修改一個awk內(nèi)部的變量
-f 從腳本文件中讀取awk命令
輸入分隔符,awk默認(rèn)是空格,空白字符,英文是field separator,變量名是FS
輸出分隔符,output field separator,簡稱0FS

awk模式

關(guān)系運算符 含義 用法示例
< 小于 x < y
<= 小于等于 x <= y
== 等于 x == y
!= 不等于 x != y
>= 大于等于 x >= y
> 大于 x > y
~ 與對應(yīng)的正則匹配則為真 x ~ /正則/
!~ 與對應(yīng)的正則不匹配則為真 x !~ /正則/
`-F 自定義輸入分隔符`
[root@localhost ~]# awk -F ":"  'NR==1{print $0}' /tmp/passwd.txt 
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# awk -F ":"  'NR==1{print $1}' /tmp/passwd.txt 
root

`還可以用 FS 搭配-v 使用 改變輸入分隔符`
[root@localhost ~]# awk -v FS=":" 'NR==1{print $1}' /tmp/passwd.txt 
root

`使用單個逗號 輸出分隔符默認(rèn)是空格`
[root@localhost ~]# awk -F":" 'NR==1{print $1,$NF}' /tmp/passwd.txt 
root /bin/bash

`自定義輸出分割符號`
[root@localhost ~]# awk -F":" 'NR==1{print $1,"----------",$NF}' /tmp/passwd.txt 
root ---------- /bin/bash  

`OFS 修改默認(rèn)輸出分隔符`
[root@localhost ~]# awk -F":" -v OFS="---------" 'NR==1{print $1,$NF}' /tmp/passwd.txt 
root---------/bin/bash 

`將輸出分隔符修改為制表符`
[root@localhost ~]# awk -F":" -v OFS="\t" 'NR==1{print $1,$NF}' /tmp/passwd.txt 
root    /bin/bash

`RS 指定符號為換行符`
[root@localhost ~]# awk -v RS=' ' '{print NR,$0}' /tmp/awktest.txt
1 xux1
2 xux2
3 xux3
4 xux4
5 xux5
6 
xux6
7 xux7
8 xux8
9 xux9
10 xux10
11 
xux11

`ORS 將換行符換成自定義符號`
[root@localhost ~]# awk -v ORS='--------' '{print NR,$0}' /tmp/awktest.txt
1 xux1 xux2 xux3 xux4 xux5 --------2 xux6 xux7 xux8 xux9 xux10 --------3 xux11 xux12 xux13 xux14 xux15 --------4 xux16 xux17 xux18 xux19 xux20 --------5 xux21 xux22 xux23 xux24 xux25 --------6 xux26 xux27 xux28 xux29 xux30 --------7 xux31 xux32 xux33 xux34 xux35 --------8 xux36 xux37 xux38 xux39 xux40 --------9 xux41 xux42 xux43 xux44 xux45 --------10 xux46 xux47 xux48 xux49 xux50--------

`BEGIN模式`
[root@localhost ~]# awk 'BEGIN{print "這是begin模式"} NR==1{print NR,$0}' /tmp/awktest.txt 
這是begin模式
1 xux1 xux2 xux3 xux4 xux5 

`BEGIN模式可以不加文件; awk可以使用自定義變量`
[root@localhost ~]# awk -v name="plmm" 'BEGIN{print "我喜歡",name}'
我喜歡 plmm

`ARGV[N] 第一個是awk命令本身 第二個是文件名`
[root@localhost ~]# awk '{print ARGV[0],ARGV[1],$0}' /tmp/awktest.txt 
awk /tmp/awktest.txt xux1 xux2 xux3 xux4 xux5 
awk /tmp/awktest.txt xux6 xux7 xux8 xux9 xux10 
awk /tmp/awktest.txt xux11 xux12 xux13 xux14 xux15 
awk /tmp/awktest.txt xux16 xux17 xux18 xux19 xux20 
awk /tmp/awktest.txt xux21 xux22 xux23 xux24 xux25 
awk /tmp/awktest.txt xux26 xux27 xux28 xux29 xux30 
awk /tmp/awktest.txt xux31 xux32 xux33 xux34 xux35 
awk /tmp/awktest.txt xux36 xux37 xux38 xux39 xux40 
awk /tmp/awktest.txt xux41 xux42 xux43 xux44 xux45 
awk /tmp/awktest.txt xux46 xux47 xux48 xux49 xux50
[root@localhost ~]# awk '{print ARGV[0],ARGV[1],ARGV[2],$0}' /tmp/awktest.txt 
awk /tmp/awktest.txt  xux1 xux2 xux3 xux4 xux5 
awk /tmp/awktest.txt  xux6 xux7 xux8 xux9 xux10 
awk /tmp/awktest.txt  xux11 xux12 xux13 xux14 xux15 
awk /tmp/awktest.txt  xux16 xux17 xux18 xux19 xux20 
awk /tmp/awktest.txt  xux21 xux22 xux23 xux24 xux25 
awk /tmp/awktest.txt  xux26 xux27 xux28 xux29 xux30 
awk /tmp/awktest.txt  xux31 xux32 xux33 xux34 xux35 
awk /tmp/awktest.txt  xux36 xux37 xux38 xux39 xux40 
awk /tmp/awktest.txt  xux41 xux42 xux43 xux44 xux45 
awk /tmp/awktest.txt  xux46 xux47 xux48 xux49 xux50

`在引用外部變量`
[root@localhost ~]# what="我喜歡plmm?。?!"
[root@localhost ~]# awk -v name=$what 'BEGIN{print name}'
我喜歡plmm?。?!

7, print 和 printf 的區(qū)別

  • ? printf動作默認(rèn)不會添加換行符

  • ? print 默認(rèn)添加空格換行符

  • ? printf需要指定format;

    • %d 打印單個ASCII 字符 printf("The character is %c\n",x) 輸出: The character is A
      %d 打印一個十進(jìn)制數(shù) printf("The boy is %d years old\n",y) 輸出:The boy is 15 years old
      %e 打印數(shù)字的e 記數(shù)法形式 printf("z is %e\n",z) 打印: z is 2.3e+0 1
      %f 打印一個浮點數(shù) printf("z is %f\n", 2.3 * 2) 輸出: z is 4.600000
      %o 打印數(shù)字的八進(jìn)制 printf("y is %o\n",y) 輸出:z is 17
      %s 打印一個字符串 print("The name of the culprit is %s\n",$1) 輸出:The name of the culprit is Bob Smith
  • printf修飾符文章來源地址http://www.zghlxwxcb.cn/news/detail-514682.html

    • -:左對齊,默認(rèn)右對齊
    • +:顯示數(shù)值符號;printf "%+d"
[root@localhost ~]# awk '{printf $1}' /tmp/awktest.txt 
xux1xux6xux11xux16xux21xux26xux31xux36xux41xux46[root@localhost ~]# 

`%s`
[root@localhost ~]# awk '{printf "%s\n",$1}' /tmp/awktest.txt 
xux1
xux6
xux11
xux16
xux21
xux26
xux31
xux36
xux41
xux46

[root@localhost ~]# awk '{printf "第一列 %s     第二列 %s    第三列 %s\n",$1,$2,$3}' /tmp/awktest.txt 
第一列 xux1     第二列 xux2    第三列 xux3
第一列 xux6     第二列 xux7    第三列 xux8
第一列 xux11     第二列 xux12    第三列 xux13
第一列 xux16     第二列 xux17    第三列 xux18
第一列 xux21     第二列 xux22    第三列 xux23
第一列 xux26     第二列 xux27    第三列 xux28
第一列 xux31     第二列 xux32    第三列 xux33
第一列 xux36     第二列 xux37    第三列 xux38
第一列 xux41     第二列 xux42    第三列 xux43
第一列 xux46     第二列 xux47    第三列 xux48

`%d`
[root@localhost ~]# awk 'BEGIN{printf "%d%d%d%d\n",1,2,3,4}'
1234

`- +對齊` 
[root@localhost ~]# awk '{printf "第一列 %-20s第二列 %-20s第三列 %-20s\n",$1,$2,$3}' /tmp/awktest.txt 
第一列 xux1                第二列 xux2                第三列 xux3                
第一列 xux6                第二列 xux7                第三列 xux8                
第一列 xux11               第二列 xux12               第三列 xux13               
第一列 xux16               第二列 xux17               第三列 xux18               
第一列 xux21               第二列 xux22               第三列 xux23               
第一列 xux26               第二列 xux27               第三列 xux28               
第一列 xux31               第二列 xux32               第三列 xux33               
第一列 xux36               第二列 xux37               第三列 xux38               
第一列 xux41               第二列 xux42               第三列 xux43               
第一列 xux46               第二列 xux47               第三列 xux48   

grep 練習(xí)題

`找出root開頭的行`
[root@localhost ~]# grep '^root' /tmp/passwd.txt 
root:x:0:0:root:/root:/bin/bash

`匹配以root開頭或者以mysql開頭的行,注意定位錨點`
[root@localhost ~]# grep -E '^(root|mysql)' /etc/passwd
root:x:0:0:root:/root:/bin/bash
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin

`過濾出除了root開頭的行`
[root@localhost ~]# grep -v '^root' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

`統(tǒng)計root出現(xiàn)的次數(shù)`
[root@localhost ~]# grep 'root' /etc/passwd -c
2

`匹配test用戶最多一次 -m`
[root@localhost ~]# grep '^test' /etc/passwd -m 1
test:x:1000:1000:test:/home/test:/bin/bash

`匹配多個文件,列出存在信息的文件名字`
[root@localhost ~]# grep 'test' /tmp/passwd.txt /etc/passwd /tmp/test.txt -l
/tmp/passwd.txt
/etc/passwd

`顯示/etc/passwd文件中不以/bin/bash結(jié)尾的行`
[root@localhost ~]# grep -v '/bin/bash$' /tmp/passwd.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

`匹配uid和gid是2,3數(shù)字的行`
[root@localhost ~]# grep -E '\<[0-9]{2,3}\>' /tmp/passwd.txt 
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

`找出文件中,以至少一個空白字符開頭,后面是非空字符的行`
[root@localhost ~]# grep '^[[:space:]].*' /tmp/luffy2.txt 
 happy every day
[root@localhost ~]# grep '^[[:space:]]+[^[:space:]]' /tmp/luffy2.txt  -E
 happy every day
 
[root@localhost ~]# grep -E '^(root|mysql|xiao)' /tmp/passwd.txt 
root:x:0:0:root:/root:/bin/bash
xiaosang:x:1001:1001::/home/xiaosang:/bin/bash
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
xiao:x:555:555::/home/www:/shbin/nologin
xiao1:x:555:555::/home/www:/shbin/nologin

[root@localhost ~]# grep -E '^(root|mysql|xiao)\>' /tmp/passwd.txt 
root:x:0:0:root:/root:/bin/bash
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
xiao:x:555:555::/home/www:/shbin/nologin
 
`找出/etc/init.d/functions文件中的所有函數(shù)名`
[root@localhost ~]# grep -E '[a-zA-Z]+\(\)' /etc/init.d/functions 
checkpid() {
__kill_pids_term_kill_checkpids() {
__kill_pids_term_kill() {
__pids_var_run() {
__pids_pidof() {
daemon() {
killproc() {

`找出:前面字符與結(jié)尾相同的行`
[root@localhost ~]# grep -E '^([^:]+).*\1$' /tmp/passwd.txt 
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
nobody:x:99:99:Nobody:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
nginx:x:987:981:Nginx web server:/var/lib/nginx:/sbin/nologin

sed 練習(xí)題

`將開頭是#符號的行和空行刪除`
[root@localhost ~]# sed -e '/^$/d' -e '/^#/d' /tmp/luffy2.txt 
I teach linux.
I like c++.
happy every day
 good good study

`將文本中空行,開頭是空格的行替換為#`
[root@localhost ~]# sed -e 's/^[[:space:]]/#/g' -e 's/^$/#/g' /tmp/luffy2.txt 
I teach linux.
#
I like c++.
#
happy every day
#
#good good study
#
#

`在文本前三行加上@符號` ==用了擴展正則表達(dá)式 -r,引用了原文 \1==
[root@localhost ~]# sed  -r '1,3s/(^.)|(^$)/@\1/' /tmp/luffy2.txt 
@I teach linux.
@
@I like c++.

happy every day

 good good study
 
 
`sed 取ip地址`
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.70.14  netmask 255.255.255.0  broadcast 192.168.70.255
        inet6 fe80::3a93:caf:b995:b1d6  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:c0:b0:a1  txqueuelen 1000  (Ethernet)
        RX packets 13469  bytes 1208013 (1.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9149  bytes 1040700 (1016.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        
[root@localhost ~]# ifconfig ens33 | sed '2s/^.*inet//;2s/netm.*//p'  -n
 192.168.70.14


`sed 找出系統(tǒng)版本`
[root@localhost ~]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
`中括號中間^取反,+貪婪匹配,() \1 擴展正則`
[root@localhost ~]# sed -r 's/^.*release[[:space:]]//;s/([^.]+).*/\1/p' /etc/centos-release -n
7

awk練習(xí)題

`在當(dāng)前系統(tǒng)中打印用戶的用戶名和家目錄`
[root@localhost ~]# awk -F ":" '$3>=1000{print $1,$(NF-1)}' /tmp/passwd.txt 
nfsnobody /var/lib/nfs
test /home/test
xiaosang /home/xiaosang
biaosang /home/biaosang

`給/tmp/xuxu.txt文件的前五行,添加#號`
[root@localhost ~]# awk 'NR<6{print "#",$0}' /tmp/awktest.txt 
# xux1 xux2 xux3 xux4 xux5 
# xux6 xux7 xux8 xux9 xux10 
# xux11 xux12 xux13 xux14 xux15 
# xux16 xux17 xux18 xux19 xux20 
# xux21 xux22 xux23 xux24 xux25 

`找出/tmp/tel.txt中的電話號碼`
[root@localhost ~]# cat /tmp/tel.txt 
Mike Harrington:[510] 548-1278:250:100:175

Christian Dobbins:[408] 538-2358:155:90:201

Archie McNichol:[206] 548-1348:250:100:175

Jody Savage:[206] 548-2788:15 :188:150

Dan Savage:[406] 298-7744:450:300:275

Nancy McNeil:[206] 548-1278:250:80:75

Elizabeth Stachelin:[916] 440-1763:175:75:300

[root@localhost ~]# awk -F "[ :]" '!/^$/{print $4}' /tmp/tel.txt 
548-1278
538-2358
548-1348
548-2788
298-7744
548-1278
440-1763

`找出Mike的電話號碼`
[root@localhost ~]# awk -F "[ :]" '/^Mike/{print $4}' /tmp/tel.txt 
548-1278

`找出姓(第二列)以D開頭 的信息 利用正則x~/正則/`
[root@localhost ~]# awk -F "[ :]" '$2~/^D/{print $0}' /tmp/tel.txt 
Christian Dobbins:[408] 538-2358:155:90:201

`打印Mike最后3行數(shù)字,并在千米那加上$`
[root@localhost ~]# awk -F "[ :]" '/^[Mike]/{print "$"$5,"$"$6,"$"$7}' /tmp/tel.txt 
$250 $100 $175

`姓名反過來,并在中間用逗號分開`
[root@localhost ~]# awk -F "[ :]" '!/^$/{print $2","$1}' /tmp/tel.txt 
Harrington,Mike
Dobbins,Christian
McNichol,Archie
Savage,Jody
Savage,Dan
McNeil,Nancy
Stachelin,Elizabeth

[root@localhost ~]# awk -F "[ :]" -v OFS=',' '!/^$/{print $2,$1}' /tmp/tel.txt 
Harrington,Mike
Dobbins,Christian
McNichol,Archie
Savage,Jody
Savage,Dan
McNeil,Nancy
Stachelin,Elizabeth

`打印非空行`
[root@localhost ~]# awk '!/^$/{print $0}' /tmp/tel.txt 
Mike Harrington:[510] 548-1278:250:100:175
Christian Dobbins:[408] 538-2358:155:90:201
Archie McNichol:[206] 548-1348:250:100:175
Jody Savage:[206] 548-2788:15 :188:150
Dan Savage:[406] 298-7744:450:300:275
Nancy McNeil:[206] 548-1278:250:80:75
Elizabeth Stachelin:[916] 440-1763:175:75:300

到了這里,關(guān)于Linux三劍客grep、sed、awk(包括練習(xí)題)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Linux 文本處理三劍客:grep、sed 和 awk

    awk、grep、sed是linux操作文本的三大利器,合稱文本三劍客,也是必須掌握的linux命令之一。三者的功能都是處理文本,但側(cè)重點各不相同,其中屬awk功能最強大,但也最復(fù)雜。grep更適合單純的查找或匹配文本,sed更適合編輯匹配到的文本,awk更適合格式化文本,對文本進(jìn)行較

    2024年01月17日
    瀏覽(97)
  • Linux中字符處理三劍客(grep sed awk )

    在 Linux 系統(tǒng)中,字符處理流程可以利用三個常用的工具來完成,三劍客的具體說明如下: grep:grep 是一種強大的文本搜索工具,可以搜索文件內(nèi)容中包含指定文本的行,并打印出包含該文本的行。grep 命令通常用于搜索日志文件、配置文件等。 在Linux中,\\\"grep\\\"是一種文本搜索

    2024年02月08日
    瀏覽(117)
  • Linux:管道命令與文本處理三劍客(grep、sed、awk)

    Linux:管道命令與文本處理三劍客(grep、sed、awk)

    眾所周知,bash命令執(zhí)行的時候會輸出信息,但有時這些信息必須要經(jīng)過幾次處理之后才能得到我們想要的格式,此時應(yīng)該如何處置?這就牽涉到 管道命令(pipe) 了。管道命令使用的是 | 這個界定符號。另外,管道命令與連續(xù)執(zhí)行命令是不一樣的,這點下面我們會說明。 我們先

    2023年04月18日
    瀏覽(35)
  • Linux三劍客(awk、sed、grep) 和 正則表達(dá)式

    Linux三劍客(awk、sed、grep) 和 正則表達(dá)式

    本文章適用于一定工作經(jīng)驗(熟悉Linux基礎(chǔ))的同行,歡迎各位大佬批判指正。 上手三劍客(grep,sed,awk)之前,需要熟悉正則表達(dá)式, 正則表達(dá)式 ——事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達(dá)對字符串的

    2024年02月15日
    瀏覽(93)
  • Linux文本三劍客---awk

    Linux文本三劍客---awk

    Linux文本三劍客之一(grep,sed,awk),功能最強大的文本工具。 逐行讀取輸入的文本內(nèi)容,默認(rèn)以空格和tab鍵作為分隔符。但是多個空格或者tab鍵的空格,會自動壓縮成一個,然后按照指定的模式和條件執(zhí)行編輯命令 可以在免交互的情況下,實現(xiàn)復(fù)雜的文本操作。完成自動化配

    2024年02月07日
    瀏覽(90)
  • Linux:文本三劍客之a(chǎn)wk

    Linux:文本三劍客之a(chǎn)wk

    awk:是一種 處理文本文件的語言 ,是一個強大的 文本分析工具 。 awk: 逐行讀取文本 ,默認(rèn)以 空格 或 tab鍵 為分隔符 進(jìn)行分隔 ,將分隔所得的 各個字段 保存到 內(nèi)建變量 中,并按模式或者條件執(zhí)行編輯命令。 1、sed命令常用于一整行的處理,而awk比較 傾向于將一行分成

    2024年02月05日
    瀏覽(95)
  • Linux 三劍客命令之 awk 詳解

    Linux 三劍客命令之 awk 詳解

    目錄 一、Awk 實戰(zhàn)講解 1.1 awk 的原理 1.2 BEGIN 和 END 模塊 1.3 運算符 1.4 常用 awk 內(nèi)置變量 1.5 awk 正則 1.6 awk 常用字符串函數(shù) ????????awk 是一種很棒的語言,它適合文本處理和報表生成,其語法較為常見,借鑒了某些語言的一些精華,如 C 語言等。在 linux 系統(tǒng)日常處理工作中

    2024年02月03日
    瀏覽(574)
  • Linux三劍客——Linux grep命令詳解:查找文件內(nèi)容

    很多時候,我們并不需要列出文件的全部內(nèi)容,而是從文件中找到包含指定信息的那些行,要實現(xiàn)這個目的,可以使用?grep 命令。 grep 命令 作為 Linux 文本處理三劍客的一員,另外兩個是 sed 和 awk ,我們會在后面的文章中作詳細(xì)介紹。 grep 命令 的由來可以追溯到 UNIX 誕生的

    2024年02月11日
    瀏覽(84)
  • Linux系統(tǒng)三劍客之grep和正則表達(dá)式的介紹(一)

    Linux系統(tǒng)三劍客之grep和正則表達(dá)式的介紹(一)

    1.正則表達(dá)式 目錄 1.正則表達(dá)式 1.什么是正則表達(dá)式 ? 2.正則表達(dá)式的使用場景 3.正則表達(dá)式字符表示 4.它們之間的區(qū)別 2.grep命令 作用: 語法: 說明: 選項:options 重點 實例 3.后面的下次再更新。? 1.什么是正則表達(dá)式 ? 一個正則表達(dá)式就是描述了一個字符串集合的方式

    2024年01月18日
    瀏覽(108)
  • linux中shell腳本——shell數(shù)組、正則表達(dá)式及文件三劍客之AWK

    linux中shell腳本——shell數(shù)組、正則表達(dá)式及文件三劍客之AWK

    目錄 一.shell數(shù)組 1.1.數(shù)組分類 1.2.定義數(shù)組方法 二.正則表達(dá)式 2.1.元字符 2.2.表示次數(shù) 2.3.位置錨定 2.4.分組 2.5.擴展正則表達(dá)式 三.文本三劍客之AWK 3.1.awk介紹及使用格式 3.2.處理動作 3.3.awk選項 3.4.awk處理模式 2.5.awk常見的內(nèi)置變量? 2.6.if條件判斷 1.1.數(shù)組分類 ①關(guān)聯(lián)數(shù)組:必

    2024年02月12日
    瀏覽(97)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包