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

来源:https://www.cnblogs.com/xuxuxuxuxu/archive/2023/07/02/17520962.html
-Advertisement-
Play Games

# Linux grep、sed、awk(包含練習題) ## 一、grep Linux grep (global regular expression) 命令用於查找文件里符合條件的字元串或正則表達式。 1. 基本用法與常見的正則表達式 > ``` > grep [options] pattern ...


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

一、grep

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

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

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

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

`找到不是mysql有關的行`
[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

`統計還有root行的行數`
[root@localhost /]# grep  "root" /tmp/passwd.txt -c
2

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

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

`找到luffy.txt文件中的空行   '^$'以空開頭 以空結尾`
[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

`找到以.結尾的行 直接寫.$會被當做任意字元 用\進行轉義`
[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結尾的行,且只顯示找到的/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

---[]符號 匹配一個指定範圍內的字元,如'[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

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

    此處使用grep -E 進行實踐擴展正則,egrep官網已經棄用

+符號
`+號表示匹配前一個字元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

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

a{n,m}匹配a的次數
`重覆前一個字元各種次數,可以通過-o參數顯示明確的匹配過程`
[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是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱為“模式空間”,接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接著處理下一行,這樣不斷重覆,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。

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

sed常用內部命令
a   在匹配後面添加
i   在匹配前面添加
p   列印
d   刪除
s   查找替換
c   更改
y   轉換   N D P 

flags
數字             表示新文本替換的模式
g:             表示用新文本替換現有文本的全部實例
p:             表示列印原始的內容
w filename:     將替換的結果寫入文件

空地址 全文匹配
單地址 指定文件某一行
/pattern/	被模式匹配的每一行
範圍區間 	10,20 十到二十行 10,+5第10行向下5行,/pattern1/,/pattern2/
步長	1~2,表示1,3,5,7,9行,2~2表示2,4,6,8,10偶數行
  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.

`找出有linux的行並列印`
[root@localhost /]# sed "/linux/p" /tmp/luffy.txt -n
I teach linux.
I like linux.

`刪除第5行至末尾行的內容`
[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 是因為其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字元。

1,主要的作用:

用來處理文本,將文本按照指定的格式輸出。其中包含了變數,迴圈以及數組。

2,語法

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

awk 參數 ‘條件動作’ 文件

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

3, action動作場景

  • $0表示整行
  • $NF表示當前分割後的最後一列
  • 倒數第二列可以寫成$(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,內置變數

NR 表示當前文件的行數
NF 表示當前文件有幾列
FS 表示當前的列分隔符
RS 表示當前的行分隔符
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,必須 外層單引號,內層雙引號

​ 內置變數 $1、$2 都不得添加雙引號,否則會識別為文本,儘量別加引號

`使用逗號預設空格分隔`
[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, 功能性參數

-F 指定分割欄位符
-v 定義或修改一個awk內部的變數
-f 從腳本文件中讀取awk命令
輸入分隔符,awk預設是空格,空白字元,英文是field separator,變數名是FS
輸出分隔符,output field separator,簡稱0FS

awk模式

關係運算符 含義 用法示例
< 小於 x < y
<= 小於等於 x <= y
== 等於 x == y
!= 不等於 x != y
>= 大於等於 x >= y
> 大於 x > y
~ 與對應的正則匹配則為真 x ~ /正則/
!~ 與對應的正則不匹配則為真 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

`使用單個逗號 輸出分隔符預設是空格`
[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 修改預設輸出分隔符`
[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 的區別

  • ​ printf動作預設不會添加換行符

  • ​ print 預設添加空格換行符

  • ​ printf需要指定format;

    • %d 列印單個ASCII 字元 printf("The character is %c\n",x) 輸出: The character is A
      %d 列印一個十進位數 printf("The boy is %d years old\n",y) 輸出:The boy is 15 years old
      %e 列印數字的e 記數法形式 printf("z is %e\n",z) 列印: z is 2.3e+0 1
      %f 列印一個浮點數 printf("z is %f\n", 2.3 * 2) 輸出: z is 4.600000
      %o 列印數字的八進位 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修飾符

    • -:左對齊,預設右對齊
    • +:顯示數值符號;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 練習題

`找出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

`統計root出現的次數`
[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結尾的行`
[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數字的行`
[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文件中的所有函數名`
[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() {

`找出:前面字元與結尾相同的行`
[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 練習題

`將開頭是#符號的行和空行刪除`
[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
#
#

`在文本前三行加上@符號` ==用了擴展正則表達式 -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 找出系統版本`
[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練習題

`在當前系統中列印用戶的用戶名和家目錄`
[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行數字,併在千米那加上$`
[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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## ThinkPHP6.0 鏈式SQL語句 #### 查詢單個數據 ```php $user = Db::query('select * from `user`'); $user=Db::table('user')->where('UserID',1001)->find();//查詢結果為空 返回 ...
  • 1. sort函數 sort函數為python內置的列表排序高階函數,所謂高階函數,也就是參數為函數或返回值為函數。 先看個簡單的例子: # 數字列表的排序示例nums = [5, 2, 9, 1, 7] nums.sort()print(nums) # 輸出:[1, 2, 5, 7, 9] 可以發 ...
  • 我們開源了組件的源代碼,希望更多人能更便捷的使用開源組件,最好的辦法當然是把組件的JAR包上傳到Maven中央倉庫,這樣可直接通過Maven/Gradle等方式快速引用和使用。但是要把JAR包上傳到Maven中央倉庫的門檻比較高,本文介紹一種非常簡單的使用GitHub/Gitee作為Maven倉庫的... ...
  • # 1. JVM快速入門 從面試開始: 1. 請談談你對JVM 的理解?java8 的虛擬機有什麼更新? 2. 什麼是OOM ?什麼是StackOverflowError?有哪些方法分析? 3. JVM 的常用參數調優你知道哪些? 4. 記憶體快照抓取和MAT分析DUMP文件知道嗎? 5. 談談JVM ...
  • 繼上篇:Taurus .Net Core 微服務開源框架:Admin 插件【4-2】 - 配置管理-Mvc【含請求日誌列印】,本篇繼續介紹下一個內容:系統配置節點:Mvc - Plugin - MicroService 配置界面:註冊中心 ...
  • [TOC] # 原理簡介 本文參考[C#/WPF/WinForm/程式實現軟體開機自動啟動的兩種常用方法](https://blog.csdn.net/weixin_42288432/article/details/120059296),將裡面中的第一種方法做了封裝成**AutoStart**類,使 ...
  • CodeBuilder是一款強大的代碼生成工具,目前發佈了 3.0,大家可以前去下載體驗 [官方主頁](http://fireasy.cn/codebuilder)。 ###1、多種數據源 * `基於 ADO.NET 的數據驅動` 基於 Fireasy 3,支持從 SqlServer、MySql、O ...
  • > [MaterialSkin.2](https://www.nuget.org/packages/MaterialSkin.2 "MaterialSkin.2") 控制項包是在 [MaterialSkin](https://github.com/IgnaceMaes/MaterialSkin "Ma ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...