文本編輯命令和三劍客

cat

-E:顯示行結束符$
-A:顯示全部控制符
-n:對顯示出的每一行進行編號
-b:非空行編號
-s:壓縮連續的空行成一行

tac rev 區別

[root06:13 PMcentos8 /tmp]#seq 5 |tac  #行轉化
5
4
3
2
1
[root06:15 PMcentos8 /tmp]#echo "1 2 3 4 5" |rev
5 4 3 2 1
[root06:15 PMcentos8 /tmp]#echo "1 2 3 4 5" |tac
1 2 3 4 5
[root06:16 PMcentos8 /tmp]#

[root06:16 PMcentos8 /tmp]#tac
3
4
56
7
7
56
4
3
     ctrl  +d 退出

[root06:19 PMcentos8 /tmp]#rev
123456789 
987654321
    ctrl  +d 退出

tail 和 head

文本編輯命令和三劍客
01.jpg

文本編輯命令和三劍客
36.png

[root06:46 PMcentos8 /tmp]#ls -lS /etc |head -3
total 1096
-rw-r--r--.  1 root root   692252 Apr  7  2020 services
-rw-r--r--.  1 root root    22219 Jun  3 09:08 ld.so.cache

-S 文件的大小排序

tail -f 和 -F

[root06:51 PMcentos8 /tmp]#tail -fn0 /var/log/messages   #看到的都是最新的日誌 

-f 跟蹤的是文件描述符。 跟蹤顯示文件fd新追加的內容,經常使用日誌監控,至關於 --follow=descriptor,當文件刪除再新建同名
文件,將沒法繼續跟蹤文件.

-F 跟蹤文件名,至關於--follow=name --retry,當文件刪除再新建同名文件,將能夠繼續跟蹤文件

按列抽取文本cut

-d DELIMITER: 指明分隔符,默認tab
 -f FILEDS:
 #: 第#個字段,例如:3
 #,#[,#]:離散的多個字段,例如:1,3,6
 #-#:連續的多個字段, 例如:1-6
 混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定輸出分隔符

[root@centos8 ~]#cut -d: -f1,3,7 --output-delimiter="---" /etc/passwd
root---0---/bin/bash
bin---1---/sbin/nologin
daemon---2---/sbin/nologin

[root07:06 PMcentos8 /tmp]#df|tr -s ' ' |cut -d' ' -f5 |tr -d %     ( tr -s ' ' 壓縮空格)
Use
0
0
3

df|tr -s ' ' '%'|cut -d% -f5   以%號爲分隔符

合併多個文件**paste**

-d 分隔符:指定分隔符,默認用TABhtml

-s : 全部行合成一行顯示node

[root07:19 PMcentos8 /data]#cat seq.txt echo.txt 
1
2
3
4
5
6
7
8
9
10
a
b
c
d
e
f
g
h
i
j
k
[root07:20 PMcentos8 /data]#paste  seq.txt echo.txt 
1   a
2   b
3   c
4   d
5   e
6   f
7   g
8   h
9   i
10  j
    k
[root07:20 PMcentos8 /data]#paste  -s seq.txt 
1   2   3   4   5   6   7   8   9   10
[root07:21 PMcentos8 /data]#paste  -s seq.txt echo.txt 
1   2   3   4   5   6   7   8   9   10
a   b   c   d   e   f   g   h   i   j   k
[root07:21 PMcentos8 /data]#paste  -sd: seq.txt echo.txt 
1:2:3:4:5:6:7:8:9:10
a:b:c:d:e:f:g:h:i:j:k

[root08:20 AMcentos8 ~]#seq 10 |paste -sd+
1+2+3+4+5+6+7+8+9+10

收集文本統計數據**wc**

wc 命令可用於統計文件的行總數、單詞總數、字節總數和字符總數
能夠對文件或STDIN中的數據統計
經常使用選項
-l 只計數行數
-w 只計數單詞總數
-c 只計數字節總數
-m 只計數字符總數
-L 顯示文件中最長行的長度

wc story.txt 
39     237    1901 story.txt
行數   單詞數   字節數

文本排序**sort**

-r 執行反方向(由上至下)整理
-R 隨機排序
-n 執行按數字大小整理
-f 選項忽略(fold)字符串中的字符大小寫
-u 選項(獨特,unique),合併重複項,即去重
-t c 選項使用c作爲字段界定符
-k # 選項按照使用c字符分隔的 # 列來整理可以使用屢次

[root07:31 PMcentos8 /data]#cut -d: -f1,3 /etc/passwd|sort -t: -k2 -nr |head -n3
nobody:65534
mysql:1006
git:1005                                    t: 冒號爲分隔符
                                            k2 -nr 以第二列數字作比較

#隨機排序:
[root07:34 PMcentos8 /data]#seq 50 |sort -R |head -n1
32
[root07:34 PMcentos8 /data]#seq 50 |sort -R |head -n1
38
[root07:34 PMcentos8 /data]#seq 50 |sort -R |head -n1
26
[root07:34 PMcentos8 /data]#seq 50 |sort -R |head -n1

 #分區利用率: 壓縮空格變成百分號   
[root07:35 PMcentos8 /data]#df| tr -s ' ' '%'|cut -d% -f5|sort -nr|head -1

uniq

文本編輯命令和三劍客
02.png
文本編輯命令和三劍客
03.jpg

-c: 顯示每行重複出現的次數
-d: 僅顯示重複過的行
-u: 僅顯示未曾重複的行

sort userlist.txt | uniq -c python

sort |uniq -c|sort -nr組合mysql

[root@centos8 data]#cut -d" " -f1 access_log |sort |uniq -c|sort -nr |head -3
   4870 172.20.116.228
   3429 172.20.116.208
   2834 172.20.0.222
   
[root@centos8 ~]#ss -nt|tail -n +2 |tr -s ' ' : |cut -d: -f6|sort|uniq -c|sort -
nr |head -n2
     7 10.0.0.1
     2 10.0.0.7

diff

文本編輯命令和三劍客
04.png

[root08:07 PMcentos8 /data]#diff -u f1.txt f2.txt
--- f1.txt  2021-06-04 20:06:23.560480355 +0800
+++ f2.txt  2021-06-04 20:07:25.734158713 +0800
@@ -1,4 +1,5 @@
 wangyu
-liu
-xue
+liuge
+wang
 xu
+shi
[root08:12 PMcentos8 /data]#diff -u f1.txt f2.txt > f.patch
[root08:15 PMcentos8 /data]#rm -f f2.txt
[root08:15 PMcentos8 /data]#patch -b f1.txt f.patch
-bash: patch: command not found
[root08:15 PMcentos8 /data]#patch -b f1.txt f.patch
patching file f1.txt
[root08:16 PMcentos8 /data]#cat f1.txt           #獲得的f2的內容
wangyu
liuge
wang
xu
shi
[root08:16 PMcentos8 /data]#cat f1.txt.orig     #獲得的是f1的內容
wangyu
liu
xue
xu

做業;

一、找出ifconfifig 「網卡名」 命令結果中本機的IPv4地址linux

[root08:25 PMcentos8 /data]#ifconfig |head -2 |tr -s ' '|tail -1|cut -d' ' -f3
10.0.0.130

二、查出分區空間使用率的最大百分比值nginx

[root08:31 PMcentos8 /data]#df -h |tr -s ' ' '%' |cut -d"%" -f5 |tail -n +2 |sort  -nr |head -1
8

三、查出用戶UID最大值的用戶名、UID及shell類型git

[root08:36 PMcentos8 /data]#sort -t: -k3 -nr </etc/passwd |head -1 |cut -d: -f1,3,7   --output-delimiter="---"
nobody---65534---/sbin/nologin

四、查出/tmp的權限,以數字方式顯示web

[root08:38 PMcentos8 /data]#ll /tmp -d
drwxrwxrwt. 9 root root 4096 Jun  4 20:22 /tmp

7777

五、統計當前鏈接本機的每一個遠程主機IP的鏈接數,並按從大到小排序正則表達式

[root08:40 PMcentos8 /data]#ss -nt|tail -n +2 |tr -s ' ' : |cut -d: -f6|sort|uniq -c|sort -nr |head -n2
      2 10.0.0.1

正則表達式

  • 正則表達式分兩類:

​ 基本正則表達式:BREsql

​ 擴展正則表達式:ERE

字符匹配

.   匹配任意單個字符,能夠是一個漢字  (在通配符中.就表示一個點)
[]   匹配指定範圍內的任意單個字符,示例:[wang]   [0-9]   [a-z]   [a-zA-Z]
[^] 匹配指定範圍外的任意單個字符,示例:[^wang] 
[:alnum:] 字母和數字
[:alpha:] 表明任何英文大小寫字符,亦即 A-Z, a-z
[:lower:] 小寫字母,示例:[[:lower:]],至關於[a-z]
[:upper:] 大寫字母
[:blank:] 空白字符(空格和製表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的範圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...)
[:digit:] 十進制數字
[:xdigit:]十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號
  • [wang] 或關係

文本編輯命令和三劍客
07.png

文本編輯命令和三劍客
06.jpg

匹配次數

* 匹配前面的字符任意次,包括0次,貪婪模式:儘量長的匹配
.* 任意長度的任意字符
\? 匹配其前面的字符0或1次,即:無關緊要
\+ 匹配其前面的字符至少1次,即:確定有,>=1
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次,<=n
\{n,\} 匹配前面的字符至少n次
*   匹配前面字符任意次
? 0或1次
+ 1次或屢次
{n} 匹配n次
{m,n} 至少m,至多n次
  • 帶不帶 /
[root@centos8 ~]#echo /etc/ |grep "/etc/\?"     0次或者1次
/etc/
[root@centos8 ~]#echo /etc |grep "/etc/\?"
/etc

位置錨定

^ 行首錨定,用於模式的最左側
$ 行尾錨定,用於模式的最右側
^PATTERN$ 用於模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 詞首錨定,用於單詞模式的左側
\> 或 \b 詞尾錨定,用於單詞模式的右側
\<PATTERN\> 匹配整個單詞
^ 行首
$ 行尾
\<, \b 語首
\>, \b 語尾
  • 排除掉空行和#開頭的行
[root@centos8 ~]#grep -v '^$' /etc/profile|grep -v '^#'
[root@centos6 ~]#grep -v '^#\|^$' /etc/httpd/conf/httpd.conf
[root@centos6 ~]#grep -v '^\(#\|$\)' /etc/httpd/conf/httpd.conf 
[root@centos6 ~]#grep "^[^#]" /etc/httpd/conf/httpd.conf    # 不是#號開頭的行,中括號表示一個字符,將空行排除

分組其它

a\|b #a或b  
C\|cat #C或cat   
\(C\|c\)at #Cat或cat

~~~是、
() 分組
後向引用:\1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat

![](D:\雲計算\7.文本編輯命令\08.jpg)

![](D:\雲計算\7.文本編輯命令\09.jpg)

![](D:\雲計算\7.文本編輯命令\10.jpg)
![08.jpg](https://s2.51cto.com/images/20210724/1627137554299128.jpg?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)![09.jpg](https://s2.51cto.com/images/20210724/1627137555497325.jpg?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)![10.jpg](https://s2.51cto.com/images/20210724/1627137555172613.jpg?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

# 正則表達式練習

~~~bash

#顯示全部的正負數  - 也要轉義,懼怕是選項 ?表示0次或者1次
[root@centos8 ~]# echo -1 -12 123 466 |grep '\-\?[0-9]\+'
-1 -12 123 466

# ifconfig取Ip
[root@centos8 ~]# echo 11.002.11.112 |grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
11.002.11.11
==========================
[root@centos8 ~]# echo 11.002.11.1124 |grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
11.002.11.1124
===============================
[root@centos8 ~]# echo 1111.002.11.112 |grep '\<[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\>'
[root@centos8 ~]# echo 111.002.11.112 |grep '\<[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\>'
111.002.11.112
=============================================
拓展的正則表達式取IP
[root@centos8 ~]# ifconfig |grep  -E '\<([0-9]{1,3}\.){3}[0-9]{1,3}\>'
        inet 10.0.0.130  netmask 255.0.0.0  broadcast 10.255.255.255
        inet 127.0.0.1  netmask 255.0.0.0

[root@centos8 ~]# echo '\<([0-9]{1,3}\.){3}[0-9]{1,3}\>'  >ip
[root@centos8 ~]# cat ip
\<([0-9]{1,3}\.){3}[0-9]{1,3}\>
[root@centos8 ~]# ifconfig  |egrep -f ip
        inet 10.0.0.130  netmask 255.0.0.0  broadcast 10.255.255.255
        inet 127.0.0.1  netmask 255.0.0.0

=====================================
#表示0-199的兩位數:  要錨定
[root@centos8 ~]# echo 123 |grep -E '1?[0-9]{,2}'    前面是1開頭,後面是無關緊要的兩位數
123
[root@centos8 ~]# echo 223 |grep -E '1?[0-9]{,2}'
223
[root@centos8 ~]# echo 223 |grep -E '\<1?[0-9]{,2}\>'
[root@centos8 ~]# echo 123 |grep -E '\<1?[0-9]{,2}\>'
123
[root@centos8 ~]# echo 1233 |grep -E '\<1?[0-9]{,2}\>'
==========================================

grep -v "^[[:space:]] *#" nginx.conf | grep -v "^$"  
#號前面有空格也能夠過濾

#去除空行              -v排除  空行
[root@centos8 ~]# grep -v  '^$' /etc/fstab

開頭不是空的
[root@centos8 ~]# grep   '^[^$]' /etc/fstab 

#去除空行和帶#的行
[root@centos8 ~]# grep   '^[^$#]' /etc/fstab 
UUID=9e5873df-59b2-44e2-939c-84aea45942bf /                       xfs     defaults        0 0
UUID=9647f29c-985e-4f9f-8fc8-3bf557cbe3ff /boot                   ext4    defaults        1 2
UUID=8a6b11db-b142-4b69-afea-02111bf91469 swap                    swap    defaults        0 0
========================================
[root@centos8 ~]# grep   '^[^$\|#]' /etc/fstab 
UUID=9e5873df-59b2-44e2-939c-84aea45942bf /                       xfs     defaults        0 0
UUID=9647f29c-985e-4f9f-8fc8-3bf557cbe3ff /boot                   ext4    defaults        1 2
UUID=8a6b11db-b142-4b69-afea-02111bf91469 swap                    swap    defaults        0 0
===========================================
[root@centos8 ~]# grep -E  '^[^$|#]' /etc/fstab 
UUID=9e5873df-59b2-44e2-939c-84aea45942bf /                       xfs     defaults        0 0
UUID=9647f29c-985e-4f9f-8fc8-3bf557cbe3ff /boot                   ext4    defaults        1 2
UUID=8a6b11db-b142-4b69-afea-02111bf91469 swap                    swap    defaults        0 0
==========================================
[root10:47 AMcentos7 ]#grep -v '^$' /etc/fstab |grep -v '^#'
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=ffe318c4-6b8c-49fc-a43a-7c15d622700e /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
========================================================================
[root11:39 AMcentos7 ]#grep ^[^#] /etc/fstab 由於中括號表示一個字符
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=ffe318c4-6b8c-49fc-a43a-7c15d622700e /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

[root11:47 AMcentos7 ]#cat fstab 

#
# /etc/fstab
# Created by anaconda on Thu Apr 15 08:42:05 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=ffe318c4-6b8c-49fc-a43a-7c15d622700e /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root11:47 AMcentos7 ]#grep ^[^#\|^$] /etc/fstab
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=ffe318c4-6b8c-49fc-a43a-7c15d622700e /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root11:48 AMcentos7 ]#grep ^[^#] /etc/fstab
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=ffe318c4-6b8c-49fc-a43a-7c15d622700e /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
-----------------------------------------------------------------------------------------
grep ^[^#\|^$] /etc/fstab
grep ^[^#] /etc/fstab       兩條效果同樣
----------------------------------------------------------------------------------------
        ^在中括號裏面表示排除
        ^在中括號外面表示開頭

單詞:數字、字母、下劃線的組合,其餘的是單詞的分隔符

vim 裏面刪除#號

:%s@^#\(.*\)@\1@
或者
:%s@^#@@  吧開頭的#號替換爲空

UUID開頭的行前加#

:%s/^UUID/#UUID/   
:%s@^\(UUID\)@#\1@g

號和空行

[root11:38 AMcentos7 ]#grep ^[^#] /etc/fstab
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=ffe318c4-6b8c-49fc-a43a-7c15d622700e /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

一、顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩種方法)

[root09:52 PMcentos8 /data]#grep -i ^s.* /proc/meminfo 

[root09:53 PMcentos8 /data]#grep ^[S\|s].* /proc/meminfo

二、顯示/etc/passwd文件中不以/bin/bash結尾的行

[root09:55 PMcentos8 /data]#grep -v  '/bin/bash$' /etc/passwd

三、顯示用戶rpc默認的shell程序

[root10:00 PMcentos8 /data]#getent passwd rpc |cut -d: -f7
/bin/bash

四、找出/etc/passwd中的兩位或三位數

grep -E '^([1-9][0-9]|[1-9][0-9][0-9])$'

五、顯示CentOS7的/etc/grub2.cfg文件中,至少以一個空白字符開頭的且後面有非空白字符的行

方法一
grep -E  ^[[:space:]].+[^' '] /etc/grub2.cfg  
方法二
grep -E  ^[[:space:]].+[^[:space:]] /etc/grub2.cfg 
方法三
grep -E  '^[[:space:]].+[^ ]' /etc/grub2.cfg

六、找出「netstat -tan」命令結果中以LISTEN後跟任意多個空白字符結尾的行

netstat -tan | grep 'LISTEN[[:space:]]*$'

七、顯示CentOS7上全部UID小於1000之內的用戶名和UID

[root11:45 PMcentos7 /data]#cat /etc/passwd |cut -d: -f1,3 |grep -E '\<[0-9]{1,3}\>' |sort -t: -k2

八、添加用戶bash、testbash、basher、sh、nologin(其shell爲/sbin/nologin),找出/etc/passwd用戶

名和shell同名的行

[root11:12 PMcentos8 /data]#grep -E  '^(.*)\>.*\<\1$'  /etc/passwd

九、利用df和grep,取出磁盤各分區利用率,並從大到小排序

[root10:42 PMcentos7 /data]#df |grep ^/dev/sd |tr -s ' ' '%' |cut -d% -f5 |sort -nr
  • grep 取Ip

    [root10:57 PMcentos8 /data]#ifconfig ens33 |grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|head -1
    10.0.0.130
    
     # 點要轉意

grep

.   匹配任意單個字符,能夠是一個漢字
.*  0次到無數次,至關於通配符裏的*
[]   匹配指定範圍內的任意單個字符,示例:[wang]   [0-9]   [a-z]   [a-zA-Z]
[^] 匹配指定範圍外的任意單個字符,示例:[^wang] 
[:alnum:] 字母和數字
[:alpha:] 表明任何英文大小寫字符,亦即 A-Z, a-z
[:lower:] 小寫字母,示例:[[:lower:]],至關於[a-z]
[:upper:] 大寫字母
[:blank:] 空白字符(空格和製表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的範圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...)
[:digit:] 十進制數字
[:xdigit:]十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號
alias grep='grep --color=auto'
.任意一個字符
?0個或一個
+ 一個以上
-q 靜默不輸出  隱藏信息
    [root09:39 AMcentos7 ]#grep -iq  Root /etc/fstab
    [root09:39 AMcentos7 ]#echo $?
    0

-c 有多少行 
    包含root的行有多少
    [root09:33 AMcentos7 ]#grep -c root /etc/passwd
    2
    包含ftp的行有多少
    [root09:33 AMcentos7 ]#grep -c ftp /etc/passwd
    1

-v 顯示不能被pattern匹配到的內容

-e 或者的關係
[root09:41 AMcentos7 ]#grep -e root -e bash /etc/passwd
或者:
[root09:47 AMcentos7 ]#grep -E 'root|bash' /etc/passwd
#且關係:
[root09:49 AMcentos7 ]#grep bash /etc/passwd |grep root

-E  擴展正則表達式,至關於egrep

-i, --ignore-case    忽略字符大小寫 ,   例如[sS]也能夠不區分大小寫
    忽略大小寫匹配
    [root09:36 AMcentos7 ]#grep -ci Ftp /etc/passwd
    1

-o, --only-matching   僅僅顯示被匹配的字符自己,例如取IP,那麼可有可無的不要顯示了
        [root10:54 AMcentos7 ]#df |grep '^/dev' |grep -o ' *[0-9]\{1,3\}%'
        5%
        10%

-m# 匹配到的只顯示#行
-w   匹配整個單詞
        [root@centos8 ~]#grep -w root /etc/passwd
        root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

-n  顯示匹配到的行行號

        -A NUM, --after-context=NUM   顯示匹配到的行的後兩行
            [root09:39 AMcentos7 ]#grep -n  root  /etc/passwd
            1:root:x:0:0:root:/root:/bin/bash
            10:operator:x:11:0:operator:/root:/sbin/nologin
            [root09:41 AMcentos7 ]#grep -nA 2  root  /etc/passwd   被匹配到的行的後兩行也顯示出來
            1:root:x:0:0:root:/root:/bin/bash
            2-bin:x:1:1:bin:/bin:/sbin/nologin
            3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
            --
            10:operator:x:11:0:operator:/root:/sbin/nologin
            11-games:x:12:100:games:/usr/games:/sbin/nologin
            12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

         -B 匹配到的行的前行 
         -C 匹配到的行的先後行
-f  比較匹配,能夠取兩個文件的相同行
[root09:50 AMcentos7 ]#cat >t.txt<<eof
> root
> bash
> eof
[root09:56 AMcentos7 ]#grep -f t.txt /etc/passwd   passwd文件裏面匹配t.txt的才配匹配
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
wang:x:1010:1010::/home/wang:/bin/bash
hua:x:1011:1011::/home/hua:/bin/bash
wanghua:x:1012:1012::/home/wanghua:/bin/bash
wanghuahua:x:1013:1013::/home/wanghuahua:/bin/bash
hello:x:1014:1014::/home/hello:/bin/bash
huahua:x:1015:1015::/home/huahua:/bin/bash
huahuahua:x:1016:1016::/home/huahuahua:/bin/bash
user1:x:1017:1017::/home/user1:/bin/bash
user2:x:1018:1018::/home/user2:/bin/bash
user3:x:1019:1019::/home/user3:/bin/bash
user4:x:1020:1020::/home/user4:/bin/bash
user5:x:1021:1021::/home/user5:/bin/bash
user6:x:1022:1022::/home/user6:/bin/bash
user7:x:1023:1023::/home/user7:/bin/bash
user8:x:1024:1024::/home/user8:/bin/bash
user9:x:1025:1025::/home/user9:/bin/bash
nginx:x:1027:1028::/home/nginx:/bin/bash
public:x:1028:1029::/home/public:/bin/bash
常見選項:
--color=auto 對匹配到的文本着色顯示
-m # 匹配#次後中止
        [root08:54 PMcentos7 ~]#grep root /etc/passwd
        root:x:0:0:root:/root:/bin/bash
        operator:x:11:0:operator:/root:/sbin/nologin
        [root08:56 PMcentos7 ~]#grep  -m1  root /etc/passwd
        root:x:0:0:root:/root:/bin/bash

-v 顯示不被pattern匹配到的行
-i 忽略字符大小寫
        [root08:57 PMcentos7 ~]#grep  -m1 -i  Root /etc/passwd
        root:x:0:0:root:/root:/bin/bash

-n 顯示匹配的行號
        [root08:58 PMcentos7 ~]#grep  -n   -i  Root /etc/passwd
        1:root:x:0:0:root:/root:/bin/bash
        10:operator:x:11:0:operator:/root:/sbin/nologin

-c 統計匹配的行數
        [root08:58 PMcentos7 ~]#grep  -c   -i  Root /etc/passwd
        2

-o 僅顯示匹配到的字符串
        [root08:59 PMcentos7 ~]#grep  -o   -i  Root /etc/passwd
        root
        root
        root
        root

-q 靜默模式,不輸出任何信息  找不找獲得都不輸出結果

-A # after, 後#行
        [root08:59 PMcentos7 ~]#grep  -nA2   root /etc/passwd
        1:root:x:0:0:root:/root:/bin/bash
        2-bin:x:1:1:bin:/bin:/sbin/nologin
        3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
        --
        10:operator:x:11:0:operator:/root:/sbin/nologin
        11-games:x:12:100:games:/usr/games:/sbin/nologin
        12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

-B # before, 前#行
        [root09:03 PMcentos7 ~]#grep  -nB2   root /etc/passwd
        1:root:x:0:0:root:/root:/bin/bash
        --
        8-halt:x:7:0:halt:/sbin:/sbin/halt
        9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
        10:operator:x:11:0:operator:/root:/sbin/nologin

-C # context, 先後各#行
        [root09:03 PMcentos7 ~]#grep  -nC2   root /etc/passwd
        1:root:x:0:0:root:/root:/bin/bash
        2-bin:x:1:1:bin:/bin:/sbin/nologin
        3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
        --
        8-halt:x:7:0:halt:/sbin:/sbin/halt
        9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
        10:operator:x:11:0:operator:/root:/sbin/nologin
        11-games:x:12:100:games:/usr/games:/sbin/nologin
        12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

-e 實現多個選項間的邏輯or關係,如:grep –e ‘cat ’ -e ‘dog’ file
-w 匹配整個單詞
        [root09:10 PMcentos7 ~]#echo rooter |grep root
        rooter
        [root09:12 PMcentos7 ~]#echo rooter |grep  -w  root
        [root09:12 PMcentos7 ~]#echo root er |grep  -w  root
        root er

-E 使用ERE,至關於egrep
-F 不支持正則表達式,至關於fgrep
-f file 根據模式文件處理
-r 遞歸目錄,但不處理軟連接
-R 遞歸目錄,但處理軟連接
yum -y install nmap 

[root@centos8 ~]#  nmap -v -sP 10.0.0.0/24 |grep -B1 up |grep 'Nmap scan report for' |grep -Eo '[0-9.]+' > ip.txt  查詢到的結果追加到 ip.txt文件
Warning: The -sP option is deprecated. Please use -sn
adjust_timeouts2: packet supposedly had rtt of -200686 microseconds.  Ignoring time.
[root@centos8 ~]# cat ip.txt 
10.0.0.1
10.0.0.2
10.0.0.254
10.0.0.130

​      -C NUM, -NUM, --context=NUM      顯示匹配到的行的先後#行
-r  遞歸顯示,不處理軟鏈接

​      -R 遞歸顯示,處理軟鏈接

[root@centos8 ~]# grep -r 'root'  /etc/*

排除掉空行和#開頭的行

[root@centos8 ~]#grep -v '^$' /etc/profile|grep -v '^#'
[root@centos6 ~]#grep -v '^#\|^$' /etc/httpd/conf/httpd.conf
[root@centos6 ~]#grep -v '^\(#\|$\)' /etc/httpd/conf/httpd.conf 
[root@centos6 ~]#grep "^[^#]" /etc/httpd/conf/httpd.conf

練習題:顯示passwd文件中ID號最大的用戶的用戶名

[13:02:34root@wanghua ~]#sort -t: -k3 -n /etc/passwd |tail -n1 
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[13:02:58root@wanghua ~]#sort -t: -k3 -n /etc/passwd |tail -n1 |cut  -d:  -f1
nfsnobody

若是root用戶存在,顯示他的默認shell

[13:07:34root@wanghua ~]#grep '^root\>'   /etc/passwd
root:x:0:0:root:/root:/bin/bash
[13:07:46root@wanghua ~]#grep '^root\>'   /etc/passwd |cut  -d: -f7
/bin/bash
[13:11:05root@wanghua ~]#id root &>/dev/null  && grep '^root\>'   /etc/passwd |cut  -d: -f7
/bin/bash

顯示netstat -tan 中以LISTEN結尾後面跟任意個空格的行

[13:19:48root@wanghua ~]#netstat -tan |grep 'LISTEN[[:space:]]*$'

找出/etc/passwd 中用戶名和同shell名的行

#先找到全部的用戶名
[13:30:44root@wanghua ~]#grep '^[[:alnum:]]\+\>'  /etc/passwd
  #後項引用
[13:27:45root@wanghua ~]#grep '\(^[[:alnum:]]\+\>\).*\1$'  /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

root用戶若是在線就顯示,不在線就說不在線

[13:36:05root@wanghua ~]#w |grep '^root\>' -q && echo 'root on login' ||echo "such user no login"
root on login
#若是不加\>那麼rooter 這樣的用戶也會顯示

取出空行和空白行

[root@centos8 ~]#grep -v "^#" /etc/profile | grep -v '^$'
[root@centos8 ~]#grep -v "^#\|^$" /etc/profile
[root@centos8 ~]#grep -v "^\(#\|$\)" /etc/profile 
[root@centos8 ~]#grep -Ev "^(#|$)" /etc/profile
[root@centos8 ~]#egrep -v "^(#|$)" /etc/profile
[root@centos6 ~]#egrep -v '^(#|$)' /etc/httpd/conf/httpd.conf

取 ip

[root@centos8 ~]#ifconfig eth0 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|head -1
10.0.0.8

取用戶名和shell相同的用戶

[root@centos8 ~]#grep "^\(.*\)\>.*\<\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:1008:1008::/home/bash:/bin/bash
nologin:x:1011:1011::/home/nologin:/sbin/nologin
[root@centos8 ~]#grep -E "^(.*)\>.*\<\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:1008:1008::/home/bash:/bin/bash
nologin:x:1011:1011::/home/nologin:/sbin/nologin
[root@centos8 ~]#egrep "^(.*)\>.*\<\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:1008:1008::/home/bash:/bin/bash
nologin:x:1011:1011::/home/nologin:/sbin/nologin

文本編輯命令和三劍客
05.jpg

擴展正則表達式練習

一、顯示三個用戶root、mage、wang的UID和默認shell

[root12:05 AMcentos7 /data]#grep -E "^root|wang|mage\>" /etc/passwd  |cut -d:  -f3,7
0:/bin/bash
1000:/bin/bash
1007:/bin/bash

二、找出/etc/rc.d/init.d/functions文件中行首爲某單詞(包括下劃線)後面跟一個小括號的行

[root12:55 AMcentos7 /data]#grep -E  '^[_[:alpha:]]+\(\)' /etc/rc.d/init.d/functions

三、使用egrep取出/etc/rc.d/init.d/functions中其基名

[root11:53 PMcentos7 /data]#echo '/etc/rc.d/init.d/functions' |grep -Eo '[^/]+$'
functions

四、使用egrep取出上面路徑的目錄名

[root11:57 PMcentos7 /data]#echo '/etc/rc.d/init.d/functions' |grep -Eo '^/.*/'
/etc/rc.d/init.d/

五、統計last命令中以root登陸的每一個主機IP地址登陸次數

[root12:48 AMcentos7 /data]#last | egrep '^root' | egrep -o '([0-9]+\.){3}[0-9]+' |sort |uniq -c

六、利用擴展正則表達式分別表示0-九、10-9九、100-19九、200-24九、250-255

grep -E '[0-9]'
grep -E '[1-9][0-9]'
grep -E '1[0-9]{2}'
grep -E '2[0-4][0-9]'
grep -E '2[0-5][0-5]'

或者:
grep -E '^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$'

七、顯示ifconfifig命令結果中全部IPv4地址

[root12:37 AMcentos7 /data]#ifconfig | grep -E -o '([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.[1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]){3}'
10.0.0.12
10.0.0.25
127.0.0.1
255.0.0.0

八、將此字符串:welcome to magedu linux 中的每一個字符去重並排序,重複次數多的排到前面

[root12:44 AMcentos7 /data]#echo 'welcome to magedu linux'|grep -o "."|sort|uniq -c|sort -nr
      3 e
      3  
      2 u
      2 o
      2 m
      2 l
      1 x
      1 w
      1 t
      1 n
      1 i
      1 g
      1 d
      1 c
      1 a

sed

工做原理

Sed是從文件或管道中讀取一行,處理一行,輸出一行;再讀取一行,再處理一行,再輸出一行,直到
最後一行。每當處理一行時,把當前處理的行存儲在臨時緩衝區中,稱爲模式空間(Pattern 
Space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下
一行,這樣不斷重複,直到文件末尾。一次處理一行的設計模式使得sed性能很高,sed在讀取大文件時
不會出現卡頓的現象。若是使用vi命令打開幾十M上百M的文件,明顯會出現有卡頓的現象,這是由於
vi命令打開文件是一次性將文件加載到內存,而後再打開。Sed就避免了這種狀況,一行一行的處理,
打開速度很是快,執行速度也很快
Stream EDitor,行編輯器

        又稱流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時

        緩衝區,稱爲"模式空間"(pattern space),接着用sed命令處理緩衝區中

        的內容,處理完成後,把緩衝區的內容送往屏幕。而後讀入下一行,執行下

        一個循環。

        若是沒有使用諸如「D」的特殊命令,那會在兩個循環之間清空模式空間,但不

        會清空保留空間。這樣不斷重複,直到文件末尾。文件內容並無改變,除非

        你使用重定向存儲輸出。

        功能:

               主要用來自動編輯一個或多個文件,簡化對文件的反覆操做,編寫轉換程序等

格式:

sed [option]... 'script;script;...' inputfile...

經常使用選項:

-n 不輸出模式空間內容到屏幕,即不自動打印

-e 多點編輯

-f /PATH/SCRIPT_FILE 從指定文件中讀取編輯腳本

-r, -E 使用擴展正則表達式

-i.bak 備份文件並原處編輯

script**格式:**

'地址命令'

地址格式:

1. 不給地址:對全文進行處理
2. 單地址:
   #:指定的行,$:最後一行
   /pattern/:被此處模式所可以匹配到的每一行
3. 地址範圍:
   #,#     #從#行到第#行,3,6 從第3行到第6行
   #,+#   #從#行到+#行,3,+4 表示從3行到第7行
   /pat1/,/pat2/
   #,/pat/
4. 步進:~
     1~2 奇數行
     2~2 偶數行

命令:

p 打印當前模式空間內容,追加到默認輸出以後
Ip 忽略大小寫輸出
        [root06:03 PMcentos8 ~]#sed -n '/Root/Ip' /etc/passwd
        root:x:0:0:root:/root:/bin/bash
        operator:x:11:0:operator:/root:/sbin/nologin

d 刪除模式空間匹配的行,並當即啓用下一輪循環
a [\\]text 在指定行後面追加文本,支持使用\n實現多行追加
i [\\]text 在行前面插入文本
c [\\]text 替換行爲單行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 讀取指定文件的文本至模式空間中匹配到的行後
= 爲模式空間中的行打印行號
! 模式空間中匹配行取反處理
s/pattern/string/修飾符 查找替換,支持使用其它分隔符,能夠是其它形式:s@@@,s###
替換修飾符:
g 行內全局替換
p 顯示替換成功的行
w   /PATH/FILE 將替換成功的行保存至文件中
I,i   忽略大小寫

' I ' 忽略大小寫

[root@localhost data]# sed -n  '/^Root/Ip' /etc/passwd
root:x:0:0:root:/root:/bin/bash

' d ' 刪除

#d :刪除模式空間中的內容

2d將編輯後的內容刪除了, -n 要原本該自動輸出的內容關閉了
[root@localhost data]# seq 10 |sed -n '2d'
[root@localhost data]# seq 10 |sed '2d'
1
3
4
5
6
7
8
9
10

[root@localhost ~]# cat   /etc/fstab  -n
     1  
     2  #
     3  # /etc/fstab
     4  # Created by anaconda on Fri Dec 18 11:46:44 2020
     5  #
     6  # Accessible filesystems, by reference, are maintained under '/dev/disk/'.
     7  # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
     8  #
     9  # After editing this file, run 'systemctl daemon-reload' to update systemd
    10  # units generated from this file.
    11  #
    12  /dev/mapper/cl-root     /                       xfs     defaults        0 0
    13  UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot                   ext4    defaults        1 2
    14  /dev/mapper/cl-swap     swap                    swap    defaults        0 0
刪除第1至第4行  若是加 -i 就修改原文件
[root@localhost ~]# sed '1,4d'  /etc/fstab |cat -n
     1  #
     2  # Accessible filesystems, by reference, are maintained under '/dev/disk/'.
     3  # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
     4  #
     5  # After editing this file, run 'systemctl daemon-reload' to update systemd
     6  # units generated from this file.
     7  #
     8  /dev/mapper/cl-root     /                       xfs     defaults        0 0
     9  UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot                   ext4    defaults        1 2
    10  /dev/mapper/cl-swap     swap                    swap    defaults        0 0
刪除指定的行    
[root@localhost ~]# sed '4d'  /etc/fstab
相對位置刪除行
從第三行開始一直刪除到第七行
[root@localhost ~]# sed '3,+4d'  /etc/fstab
#刪除全部以#開頭的行
[root@centos8 ~]#sed -i '/^#/d' fstab
#只顯示非#開頭的行
[root@centos8 ~]#sed -n '/^#/!p' fstab
#刪除第2和第4行
[root@centos8 ~]#sed -e '2d' -e '4d' seq.log
[root@centos8 ~]#sed '2d;4d' seq.log
#刪除的同時作備份
[root@centos8 ~]#sed -i.orig '2d;4d' seq.log

' a text' 追加

a \text 在行後追加文本text ,支持\n實現多行追加
[root@localhost data]# sed -n '/root/a line1' /etc/passwd
line1
line1
[root@localhost data]# sed  '/root/a line1' /etc/passwd
root:x:0:0:root:/root:/bin/bash
line1
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
line1
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin

具體某一行後添加
[root@localhost ~]# sed '8a wanghua@@' /etc/fstab |cat -n
     1  
     2  #
     3  # /etc/fstab
     4  # Created by anaconda on Fri Dec 18 11:46:44 2020
     5  #
     6  # Accessible filesystems, by reference, are maintained under '/dev/disk/'.
     7  # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
     8  #
     9  wanghua@@
    10  # After editing this file, run 'systemctl daemon-reload' to update systemd
    11  # units generated from this file.
    12  #
    13  /dev/mapper/cl-root     /                       xfs     defaults        0 0
    14  UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot                   ext4    defaults        1 2
    15  /dev/mapper/cl-swap     swap                    swap    defaults        0 0

    轉義   
[root@localhost ~]# sed '8a \"wanghua@@\"' /etc/fstab |cat -n
     1  
     2  #
     3  # /etc/fstab
     4  # Created by anaconda on Fri Dec 18 11:46:44 2020
     5  #
     6  # Accessible filesystems, by reference, are maintained under '/dev/disk/'.
     7  # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
     8  #
     9  "wanghua@@"
    10  # After editing this file, run 'systemctl daemon-reload' to update systemd
    11  # units generated from this file.
    12  #
    13  /dev/mapper/cl-root     /                       xfs     defaults        0 0
    14  UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot                   ext4    defaults        1 2
    15  /dev/mapper/cl-swap     swap                    swap    defaults        0 0

以UUID開頭的行後加內容
[root@localhost ~]# sed '/^UUID/a hello '  /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Fri Dec 18 11:46:44 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot                   ext4    defaults        1 2
hello 
/dev/mapper/cl-swap     swap                    swap    defaults        0 0
[root@localhost ~]# 

全部以數值結尾的行後加
[root@localhost ~]# sed '/[0-9]$/a huahua\nwangwang' /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Fri Dec 18 11:46:44 2020
huahua
wangwang
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
huahua
wangwang
UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot                   ext4    defaults        1 2
huahua
wangwang
/dev/mapper/cl-swap     swap                    swap    defaults        0 0
huahua
wangwang
\n 換行
\t 水平風格符

靜默模式,只顯示添加的內容
[root@localhost ~]# sed '/[0-9]$/a huahua\nwangwang' /etc/fstab -n
huahua
wangwang
huahua
wangwang
huahua
wangwang
huahua
wangwang

加2行,多行

[root@localhost data]# sed  '/root/a line1\nline2' /etc/passwd
root:x:0:0:root:/root:/bin/bash
line1
line2
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
line1
line2
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@centos8 ~]#sed -i   '/^listen 9527/a listen 80 \nlisten 8080' 
/etc/httpd/conf/httpd.conf

#刪除全部以#開頭的行
[root@centos8 ~]#sed -i '/^#/d' fstab
#只顯示非#開頭的行
[root@centos8 ~]#sed -n '/^#/!p' fstab
#修改網卡配置
[root@centos8 ~]#sed -Ei.bak '/^GRUB_CMDLINE_LINUX/s/(.*)(")$/\1 
net.ifnames=0\2/' /etc/default/grub
#顯示空行行號
[root08:49 AMcentos7 ]#sed -n '/^$/='  /etc/issue
3
[root08:50 AMcentos7 ]#cat /etc/issue
\S
Kernel \r on an \m

[root08:50 AMcentos7 ]#

' i text' 插入與a相反

以/dev開頭的行前面加i++++++括號與/都轉義
[root@localhost ~]# sed '/^\/dev/i i++++++'  /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Fri Dec 18 11:46:44 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
i++++++
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot                   ext4    defaults        1 2
i++++++
/dev/mapper/cl-swap     swap                    swap    defaults        0 0

[root@localhost ~]# sed '2i I teacher linux\n wang\nhua' /etc/fstab 

I teacher linux
 wang
hua
#
# /etc/fstab
# Created by anaconda on Fri Dec 18 11:46:44 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot                   ext4    defaults        1 2
/dev/mapper/cl-swap     swap                    swap    defaults        0 0
[root@localhost ~]#

' c ' 替換

#將line1這一行替換爲newline1
[root@localhost data]# cat passwd
root:x:0:0:root:/root:/bin/bash
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
sync:x:5:0:sync:/sbin:/bin/sync
line1
line2
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost data]# sed -i '/line1/c\newline1' passwd
[root@localhost data]# cat passwd
root:x:0:0:root:/root:/bin/bash
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
sync:x:5:0:sync:/sbin:/bin/sync
newline1
line2
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost data]# sed -i '/halt/c\newline1' passwd
#將含有halt的行替換爲newline1
[root@localhost data]# cat passwd
root:x:0:0:root:/root:/bin/bash
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
sync:x:5:0:sync:/sbin:/bin/sync
newline1
line2
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
newline1
pipewire:x:991:985:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin
saslauth:x:990:76:Saslauthd user:/run/saslauthd:/sbin/nologin
dnsmasq:x:984:984:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
sssd:x:980:978:User for sssd:/:/sbin/nologin
flatpak:x:979:977:User for flatpak system helper:/:/sbin/nologin

' w ' 挑出一行 另存爲一個文件

w 保存模式空間匹配到的行至指定文件中
[root@localhost data]# sed '/root/w  root.log'  passwd
[root@localhost data]# cat root.log 
root:x:0:0:root:/root:/bin/bash
#將/etc/fstab 中非#開頭的行保存到/tmp/fftmp文件中
[01:47:22root@localhost scripts]#sed  '/^[^#]/w /tmp/fftmp'  /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Mon Oct 19 11:49:26 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0072ccb1-47b2-4081-97f6-7ffbe11ed5b2 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[01:48:00root@localhost scripts]#cat  /tmp/fftmp 
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0072ccb1-47b2-4081-97f6-7ffbe11ed5b2 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

# 不加-n 就輸出之後保存
[01:48:25root@localhost scripts]#sed -n  '/^[^#]/w /tmp/ffftmp'  /etc/fstab 
[01:50:16root@localhost scripts]#cat /tmp/ffftmp 
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0072ccb1-47b2-4081-97f6-7ffbe11ed5b2 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

' r ' 讀出內容到新行

[root@localhost data]# sed '/root/r  /etc/issue'  passwd
root:x:0:0:root:/root:/bin/bash
\S
Kernel \r on an \m

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
sync:x:5:0:sync:/sbin:/bin/sync
newline1
line2
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
newline1
pipewire:x:991:985:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin
saslauth:x:990:76:Saslauthd user:/run/saslauthd:/sbin/nologin
dnsmasq:x:984:984:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
sssd:x:980:978:User for sssd:/:/sbin/nologin
flatpak:x:979:977:User for flatpak system helper:/:/sbin/nologin

' ! ' 取反

#取出非#開頭的行
p能夠寫到裏面或者外面
[11:25:55root@localhost ~]#sed -n  '/^#/!p'  /etc/fstab 

/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0072ccb1-47b2-4081-97f6-7ffbe11ed5b2 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[11:26:07root@localhost ~]#sed -n  '/^#/!'p  /etc/fstab 

/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0072ccb1-47b2-4081-97f6-7ffbe11ed5b2 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
#不是#開頭的行刪除
不是#號開頭的行被刪除了,沒有 -n 攔截,剩下的帶#的流出來 
[11:30:55root@localhost ~]#sed   '/^#/!d'  /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Mon Oct 19 11:49:26 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
[11:31:01root@localhost ~]#sed   '/^#/!'d  /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Mon Oct 19 11:49:26 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#

' = ' 打印行號 爲模式匹配到的行打印行號

[root@localhost data]#  sed -n '/root/='  passwd
1
[root@localhost data]#  sed  '/root/='  passwd
1
root:x:0:0:root:/root:/bin/bash
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
sync:x:5:0:sync:/sbin:/bin/sync
newline1
line2
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
newline1
pipewire:x:991:985:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin
saslauth:x:990:76:Saslauthd user:/run/saslauthd:/sbin/nologin
dnsmasq:x:984:984:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
sssd:x:980:978:User for sssd:/:/sbin/nologin
flatpak:x:979:977:User for flatpak system helper:/:/sbin/nologin

sed搜索替代 '/正則表達式/s@@@g'

s///   查找替換,分隔符能夠自行設定,經常使用的有s@@@    s### 

替換標記:

   g 全局替換

  w/PATH/TO/SOMEFILE  將替換的結果保存到指定文件中

   p 顯示替換成功的行

   #練習1
刪除 /etc/grub2.cfg 文件裏面全部以空白字符開頭的行的行首全部空白字符
[11:51:43root@localhost ~]#sed -r 's#^[[:space:]]+##'  /etc/grub2.cfg 
錯誤的答案是:
[11:53:33root@localhost ~]#sed -r 's#^[[:space:]]+.*##'  /etc/grub2.cfg 

#練習2
刪除/etc/fstab 目錄中全部以#開頭行的行首的#號,以及#號後面的空白字符
[12:03:24root@localhost ~]#sed  -r 's@^#[[:space:]]*@@'  /etc/fstab 
多點編輯 UUID開頭的行也被刪除
[12:06:32root@localhost ~]#sed  -re 's@^#[[:space:]]*@@' -e '/^UUID/d'  /etc/fstab 
多點編輯 只是刪除UUID四個字符 (替換思想)
[12:11:02root@localhost ~]#sed  -re 's@^#[[:space:]]*@@' -e 's@^UUID@@'  /etc/fstab
vim替換
:%S/AAA/BBB/g
[root@localhost data]# sed -n '/root/s@r..t@admin@g'  /etc/passwd
[root@localhost data]# sed -n '/root/s@r..t@admin@gp'  /etc/passwd
admin:x:0:0:admin:/admin:/bin/bash
[root@localhost ~]# sed -n '/root/s@r..t@admin@gpi' /etc/passwd
admin:x:0:0:admin:/admin:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin

-n 關閉自動打印
'p'匹配到的行打印出來
's' 搜索含有root的這一行
'g' 全局
i 忽略大小寫
/  /  兩個/後接參數
不加  -n 重複打印一行UUID開頭的行
[root@localhost ~]# sed '/^UUID/p'  /etc/fstab  -n
UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot                   ext4    defaults        1 2
-n:關閉自動打印
-n 配合-p 只打印匹配的行
[root@localhost ~]# sed '/^UUID/p'  /etc/fstab  

#
# /etc/fstab
# Created by anaconda on Fri Dec 18 11:46:44 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot                   ext4    defaults        1 2
UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot                   ext4    defaults        1 2
/dev/mapper/cl-swap     swap                    swap    defaults        0 0
替換:
[root@localhost ~]# sed 's#UUID#吳樹麗#g'  /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Fri Dec 18 11:46:44 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
吳樹麗=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot                   ext4    defaults        1 2
/dev/mapper/cl-swap     swap                    swap    defaults        0 0
[root@localhost ~]# 

前半部分支撐正則表達式,後半部分是什麼就寫什麼
[root@localhost ~]# sed -r  's#swap[ ]+defaults   #hihi#'  /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Fri Dec 18 11:46:44 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot                   ext4    defaults        1 2
/dev/mapper/cl-swap     swap                    hihi     0 0
-r:拓展正則表達式
-E :同上

地址定界:
   1 空地址:對全文處理
   2 單地址:
     # :指定行
     /pattern/ 被此模式匹配到的每一行
    3 地址範圍:
      #,# 絕對地址
      # +# 相對地址
      #,/pat1/ 從指定的行開始,到一次可以被模式所匹配到的行結束之間的全部行
       /pat1/,/pat2/
       4 指明步進
         1~2 全部的奇數行
         2~2 全部的偶數行

第14行替換
[root@localhost ~]# sed '14s#defaults#auto#p' /etc/fstab -n
/dev/mapper/cl-swap     swap                    swap    auto        0 0
或者 sed '5,14s#defaults#auto#p' /etc/fstab -n
或者s@@@g  格式
i:忽略大小寫
[root@localhost ~]# sed '14s#defaults#auto#ip' /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Fri Dec 18 11:46:44 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot                   ext4    defaults        1 2
/dev/mapper/cl-swap     swap                    swap    auto        0 0
/dev/mapper/cl-swap     swap                    swap    auto        0 0 
[root@localhost ~]# sed '14s#defaults#auto#ip' /etc/fstab -n
/dev/mapper/cl-swap     swap                    swap    auto        0 0

&

[root@localhost data]# sed -n '/r..t/s@r..t@OK&@gp'  passwd
OKroot:x:0:0:OKroot:/OKroot:/bin/bash
[root@localhost data]# sed -n '/r..t/s@r..t@&OK@gp'  passwd
rootOK:x:0:0:rootOK:/rootOK:/bin/bash

1.找到r..t的行
2.把裏面的r..t替換爲OKr..t

sed 取基名

[12:21:25root@localhost ~]#echo '/etc/log/message' |sed -r 's@[^/]+$@@'  思想是把行尾的非斜線字符替換爲空的
[12:24:45root@localhost ~]#echo '/etc/log/message/' |sed -r 's@[^/]+\/?$@@'
/etc/log/
[12:25:05root@localhost ~]#echo '/etc/log/message/' |sed -r 's@[^/]+/?$@@' 思想是加上 ?號保證斜線是無關緊要的
                -r 選項之後無需轉義斜線
/etc/log/   

[root@localhost ~]# echo /etc/sysconfig/network-scripts/ |sed -nE 's#^(.*)\/([^/]+\/?)$#\1#p'
/etc/sysconfig
[root@localhost ~]# echo /etc/sysconfig/network-scripts/ |sed -nE 's#^(.*)\/([^/]+\/?)$#\2#p'
network-scripts/
[root@localhost ~]# echo /etc/sysconfig/network-scripts/ |sed -nE 's#^(.*)\/([^/]+\/?$)#\2#p'
network-scripts/
[root@localhost ~]# echo /etc/sysconfig/network-scripts/ |sed -nE 's#\/(.*)\/([^/]+\/?$)#\2#p'
network-scripts/
[root@localhost ~]# echo /etc/sysconfig/network-scripts/ |sed -nE 's#(.*)\/([^/]+\/?$)#\2#p'
network-scripts/

   基名不帶/

[root@localhost ~]# echo /etc/sysconfig/network-scripts/ |sed -nE 's#(.*)\/([^/]+)\/?$#\2#p'
network-scripts
============
或者不用正則表達式
[root@localhost ~]# echo /etc/sysconfig/network-scripts/ 
|sed -n 's#\(.*\)\/\([^/]\+\/\?$\)#\2#p'
network-scripts/

1 ([^/]+\/?)$  或者([^/]+\/?$)  斜線結尾,前面非斜線的次數一次以上
2  \/ 斜線
3  ^(.*)任意內容開頭

sed 和grep取文件名和後綴和前綴

[root@localhost ~]# echo a.b.c.gz |sed -n 's#(.*)\.([^.]+$)#\1#p'
sed: -e expression #1, char 21: invalid reference \1 on `s' command's RHS
[root@localhost ~]# echo a.b.c.gz |sed -nE 's#(.*)\.([^.]+$)#\1#p'
a.b.c
[root@localhost ~]# echo a.b.c.gz |sed -nE 's#(.*)\.([^.]+$)#\2#p'
gz
[root@localhost ~]# echo a.b.c.gz |sed -nr 's#(.*)\.([^.]+$)#\2#p'
gz

1   [^.]+$  結尾是非. 且次數一次以上
2    .
3    .*    任意內容

grep取
[root@localhost ~]# echo a.b.c.gz |grep -Eo '[^.]+$'
gz
[root@localhost ~]# echo a.b.c.gz |grep -Eo '.*\.'
a.b.c.
[root@localhost ~]# echo a.b.c.gz |grep -Eo '.*\.' |cut -d. -f1-3
a.b.c

取出IP

方法一:
[root@localhost ~]# ifconfig ens32 |sed -n '2p'
        inet 10.0.0.147  netmask 255.255.255.0  broadcast 10.0.0.255
[root@localhost ~]# ifconfig ens32 |sed -n '2p'|sed  's#.*inet##g'
 10.0.0.147  netmask 255.255.255.0  broadcast 10.0.0.255
[root@localhost ~]# ifconfig ens32 |sed -n '2p'|sed  's#.*inet##g'|sed 's#net.*##'
 10.0.0.147 
 方法二:
[root@localhost ~]# ifconfig ens32 |sed -n '2s#.*inet##' 
[root@localhost ~]#
[root@localhost ~]# ifconfig ens32 |sed -n '2s#.*inet##p' 
 10.0.0.147  netmask 255.255.255.0  broadcast 10.0.0.255
[root@localhost ~]# ifconfig ens32 |sed -n '2s#.*inet##p' |sed 's#net.*##p'
 10.0.0.147  
 10.0.0.147  
[root@localhost ~]# ifconfig ens32 |sed -n '2s#.*inet##p' |sed 's#net.*##p' -n
 10.0.0.147
替換爲空要打印出來
[root@localhost ~]# ifconfig ens32 |sed -n '2s#.*inet##p' |sed 's#net.*##'
 10.0.0.147

 [root@localhost ~]# ifconfig ens32 |sed -nE '2s#^[^0-9]+([0-9.]{7,15}).*#\1#p'
10.0.0.147

[root@localhost ~]# ifconfig ens32 |sed -ne '2s#.*inet##'  -e  's#netmas.*##p'
 10.0.0.147

4 sed 用隨機變量

[root@localhost ~]# echo |sed "s/^/$RANDOM.rmvb/"
401.rmvb
[root@localhost ~]# echo |sed "s/^/$RANDOM.rmvb/"
3118.rmvb
[root@localhost ~]# echo |sed "s/^/$RANDOM.rmvb/"
4625.rmvb
[root@localhost ~]# echo |sed 's/^/$RANDOM.rmvb/'
$RANDOM.rmvb
[root@localhost ~]# echo |sed 's/^/'''$RANDOM'''.rmvb/'
18126.rmvb
[root@localhost ~]# echo |sed 's/^/'''$RANDOM'''.rmvb/'
31500.rmvb

文本編輯命令和三劍客
13.png

文本編輯命令和三劍客
17.jpg

sed ' ' 至關於 cat

-n 'p' 只打印一份,關閉默認打印,不重複打印

-n '3p' 只打印第3行

[root05:25 PMcentos8 ~]#sed -n '$p' /etc/passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root05:35 PMcentos8 ~]#tail -n1 /etc/passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
  • 非#開頭的行

[root05:40 PMcentos8 ~]#grep '^[^#]' /etc/fstab

[root05:40 PMcentos8 ~]#sed -n '/^[^#]/p' /etc/fstab

#包含root 的行
[root05:44 PMcentos8 ~]#sed -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root05:45 PMcentos8 ~]#grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

#以root開頭的行
[root05:44 PMcentos8 ~]#sed -n '/^root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root05:46 PMcentos8 ~]#grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
#打印從第幾行到第幾行
[root05:46 PMcentos8 ~]#nl /etc/passwd |sed -n '3,6p'
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync

[root05:50 PMcentos8 ~]#nl /etc/passwd |sed -n '3,+1p'
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
#模式匹配
[root05:55 PMcentos8 ~]#sed -n '/^d/,/^s/p' /etc/passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
dbus:x:81:81:System message bus:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
#打印最後一行
[root08:24 AMcentos7 ]#sed -n '$p' /etc/passwd
public:x:1028:1029::/home/public:/bin/bash
#打印非#開頭的行,p能夠寫到模式空間裏面或者外面都沒有錯
[11:19:37root@localhost ~]#sed -n '/^[^#]/'p  /etc/fstab 
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0072ccb1-47b2-4081-97f6-7ffbe11ed5b2 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[11:21:33root@localhost ~]#sed -n '/^[^#]/p'  /etc/fstab 
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=0072ccb1-47b2-4081-97f6-7ffbe11ed5b2 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@centos8 ~]#seq 10 | sed -n '3,+4p'
34567
[root@centos8 ~]#seq 10 | sed -n '3,$p'
345678
#打印不包含UUIDt的行
[root06:10 PMcentos8 ~]#sed '/UUID/d' /etc/fstab 
[root06:12 PMcentos8 ~]#sed  -n  '/UUID/!p' /etc/fstab 
[root06:14 PMcentos8 ~]#sed  -n  '/UUId/I!p' /etc/fstab

標準輸入

[root@localhost data]# sed '' </etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sat Nov 21 03:07:38 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=23a00316-a763-4b59-9c6a-42bd27f4e7c1 /boot                   ext4    defaults        1 2
/dev/mapper/cl-swap     swap                    swap    defaults        0 0

sed代替grep的功能

[root@localhost data]# sed -n  '/^root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost data]# sed '/^root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
daemons:/run/gluster:/sbin/nologin
chrony:x:993:988::/var/lib/chrony:/sbin/nologin
setroubleshoot:x:992:986::/var/lib/setroubleshoot:/sbin/nologin
pipewire:x:991:985:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin
saslauth:x:990:76:Saslauthd user:/run/saslauthd:/sbin/nologin
dnsmasq:x:984:984:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin

-n 關閉自動打印

追加 插入 替換

[root05:39 PMcentos8 ~]#seq 10 |sed '5a abc'
1
2
3
4
5
abc
6
7
8
9
10
[root06:17 PMcentos8 ~]#seq 10 |sed   '5aabc'
1
2
3
4
5
abc
6
7
8
9
10
root06:17 PMcentos8 ~]#seq 10 |sed '5           aabc'
1
2
3
4
5
abc
6
7
8
9
10
[root06:23 PMcentos8 ~]#seq 10 |sed  '5a\   abc\ndef'
1
2
3
4
5
   abc
def
6
7
8
9
10

[root06:17 PMcentos8 ~]#seq 10 |sed '5,8aabc'
1
2
3
4
5
abc
6
abc
7
abc
8
abc
9
10

[root06:23 PMcentos8 ~]#seq 10 |sed  '5i\   abc\ndef'
1
2
3
4
   abc
def
5
6
7
8
9
10
[root06:24 PMcentos8 ~]#seq 10 |sed  '5c\   abc\ndef'
1
2
3
4
   abc
def
6
7
8
9
10

-e 多點編輯

[root06:25 PMcentos8 ~]#seq 10 |sed -e '5aabc' -e '5iefg'
1
2
3
4
efg
5
abc
6
7
8
9
10

w 寫入到別的文件

#以b開頭的行
[root06:33 PMcentos8 ~]#sed -n '/^b/w  /data/b.log'  /etc/passwd
[root06:34 PMcentos8 ~]#cat /data/b.log 
bin:x:1:1:bin:/bin:/sbin/nologin

#第三行寫入到文件
[root06:35 PMcentos8 ~]#sed -n '3w  /data/b.log'  /etc/passwd
[root06:36 PMcentos8 ~]#cat /data/b.log 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#區間
[root06:35 PMcentos8 ~]#sed -n '3,6w  /data/b.log'  /etc/passwd

r

[root06:36 PMcentos8 ~]#seq 10 |sed '3r  /etc/issue'
1
2
3
\S
Kernel \r on an \m

4
5
6
7
8
9
10

[root06:41 PMcentos8 ~]#seq 10 |sed '3,6r  /etc/issue'
1
2
3
\S
Kernel \r on an \m

4
\S
Kernel \r on an \m

5
\S
Kernel \r on an \m

6
\S
Kernel \r on an \m

7
8
9
10

文本編輯命令和三劍客

14.jpg

文本編輯命令和三劍客
15.jpg

-i 選項

#刪除包含root的行
[root06:56 PMcentos8 /data]#ls
b.log  passwd
[root06:56 PMcentos8 /data]#sed -i.bak '/root/d' passwd 
[root06:57 PMcentos8 /data]#sed -n '/root/p' passwd 
[root06:57 PMcentos8 /data]#

#修改用戶名
[root07:02 PMcentos8 /data]#sed -i.bak  -e   '/^User apache/cUser daemon' -e '/^Group apache/cGroup daemon' /etc/httpd/conf/httpd.conf 
[root07:39 PMcentos8 /data]#sed -iE  -e  's#^User .*#User apache #g'  -e 's#Group .*#Group apache#g'  /etc/httpd/conf/httpd.conf

#修改selinux
[root07:10 PMcentos8 /data]#sed -i.bak '/SELINUX=enforcing/cSELINUX=disabled'  /etc/sysconfig/selinux 
[root07:39 PMcentos8 /data]#sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux.bak 

#修改網卡名字  
[root08:15 PMcentos8 ~]#cat /etc/default/grub 
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

#掐頭去尾,中間加內容
[root08:19 PMcentos8 ~]#sed -Ei   '/^GRUB_CMDLINE_LINUX/s/(.*)(")$/\1  net.ifnames=0 \2/'  /etc/default/grub 
[root08:15 PMcentos8 ~]#sed -Ei   '/^GRUB_CMDLINE_LINUX/s/(.*)"$/\1  net.ifnames=0"/' /etc/default/grub

sed 的高級用法:

P     打印模式空間開端至\n內容,並追加到默認輸出以前

        h     把模式空間中的內容覆蓋至保持空間中

        H     把模式空間中的內容追加至保持空間中

        g     從保持空間取出數據覆蓋至模式空間

        G     從保持空間取出內容追加至模式空間

        x       把模式空間中的內容與保持空間中的內容進行替換

        n     讀取匹配到的行的下一行覆蓋至模式空間

        N     讀取匹配到的行的下一行追加至模式空間

        d     刪除模式空間中的行

        D      若是模式空間中包含換行符,則刪除知道第一個換行符的模式空間中的文本,

               並不會讀取新的輸入行,而使用合成的模式空間從新啓動循環。若是模式空間

               不包含換行符,則會像發出d命令那樣啓動正常的新循環

        H h爲存 G g 爲取  如沒有存,則取爲空行
   =============================================================     
  sed -n 'n;p'file       打印偶數行

        sed '1!G;h;$!d'               漢諾塔   倒序顯示   至關於 tac

        sed 'N;D' file          只顯示了最後一行至關於 sed -n '$p' f1

        sed '$!N;$!D' file    顯示了最後兩行

        sed '$!d' file          顯示了最後一行

        sed 'G' file              每一行後都加上空行

        sed '/part/g' file     指定行替換爲空行

        sed '/^$/d;G' file 刪除空行以後每一行以後都加空行

        sed 'n;d' file           刪除偶數行(只顯示奇數行)

        sed 'n;n;d'      file   刪除3的倍數行,從第3行開始

               sed '1~3d' file        從第1行開始,隔2行刪除1行   

        顯示奇數行     

               seq 10 | sed '2~2d'

               seq 10 | sed -n '1~2p'

               seq 10 | sed 'n;d'

        顯示偶數行

               seq 10 | sed '1~2d'

               seq 10 | sed -n '2~2p'

               seq 10 | sed -n 'n;p'       

   h 將pattern space中的內容拷貝到hold space中,原來的hold space裏的內容被清除
H 將pattern space中的內容追加到hold space
g 將hold space中的內容拷貝到pattern space中,原來pattern space裏的內容清除
G 將hold space中的內容追加到pattern space
x:交換保持空間和模式空間的內容
n:表示讀取匹配到的行的下一行覆蓋到pattern中
N:表示讀取匹配到的行的下一行追加到pattern中
d  刪除模式空間中的行
D 刪除多行模式空間中的全部行
     sed  -n  'n;p'  FILE:顯示偶數行;
                sed  '1!G;h;$!d'  FILE:逆序顯示文件的內容;
                sed  ’$!d'  FILE:取出最後一行;
                sed  '$!N;$!D' FILE:取出文件後兩行;
                sed '/^$/d;G' FILE:刪除原有的全部空白行,然後爲全部的非空白行後添加一個空白行;
                sed  'n;d'  FILE:顯示奇數行;
                sed 'G' FILE:在原有的每行後方添加一個空白行;

練習

練習:
一、刪除centos7系統/etc/grub2.cfg文件中全部以空白開頭的行行首的空白字符
[root10:35 PMcentos7 ~]#sed -r 's@^([[:space:]]*)@@g' /etc/grub2.cfg

二、刪除/etc/fstab文件中全部以#開頭,後面至少跟一個空白字符的行的行首的#和空白字符

[root08:22 AMcentos7 /misc/cd/Packages]#  sed -r 's/^#[[:space:]]+//' /etc/fstab 

三、在centos6系統/root/install.log每一行行首增長#號 
[root@localhost ~]# sed -r 's/^/#/' /root/install.log

四、在/etc/fstab文件中不以#開頭的行的行首增長#號 
[root@localhost ~]# sed -r 's/^[^#](.*)/#\1/' /etc/fstab 
[root@localhost ~]#  sed -r 's/.*/#&/' /root/install.log

五、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
[root@localhost ~]# echo '/etc/fstab'| sed  -r  's#.*/([^/]/?)#\1#' 
fstab

[root@localhost ~]# echo '/etc/fstab' |sed -r 's/(.*\/).*/\1/'
/etc/

六、利用sed 取出ifconfig命令中本機的IPv4地址
root11:16 PMcentos8 ~]#ifconfig | sed -r  -e '2!d' -e 's/^[^0-9]+([0-9.]+) .*/\1/'
10.0.0.130
[root@localhost ~]# ifconfig eth0 |sed '2!d'|sed -r 's/^[^0-9]+([0-9.]+) .*/\1/'
10.0.0.6

七、統計centos安裝光盤中Package目錄下的全部rpm文件的以.分隔倒數第二個字段的重複次數
[root07:00 AMcentos7 /misc/cd/Packages]#ls |grep   "rpm"  |sed -r 's#.*\.(.*)\.rpm$#\1#' |sort |uniq -c
   1405 noarch

八、統計/etc/init.d/functions文件中每一個單詞的出現次數,並排序(用grep和sed兩種方法分別實現)
[root08:06 AMcentos7 /misc/cd/Packages]#sed -r 's#[^[:alpha:]]#\n#g' /etc/init.d/functions |sed -r '/^$/d'|sort|uniq -c |sort -n

[root08:11 AMcentos7 /misc/cd/Packages]#grep -Eo '[[:alpha:]]+' /etc/init.d/functions |sort |uniq -c|sort -n

[root08:15 AMcentos7 /misc/cd/Packages]#tr -c "[[:alpha:]]" '\n'  < /etc/init.d/functions |sort|uniq -c|sort -n

九、將文本文件的n和n+1行合併爲一行,n爲奇數行

方法一
sed -n 'N;s/\n/ /p' f1
方法二
cat f1 |xargs -n2

awk

格式:

awk [options]   'program' var=value   file…
awk [options]   -f programfile   var=value file…

說明:

program一般是被放在單引號中,並能夠由三種部分組成

BEGIN語句塊

模式匹配的通用語句塊

END語句塊

常見選項:

-F 「分隔符」 指明輸入時用到的字段分隔符,默認的分隔符是若干個連續空白符

-v var=value 變量賦值

pattern:決定動做語句什麼時候觸發及觸發事件,好比:BEGIN,END,正則表達式等

action statements:對數據進行處理,放在{}內指明,常見:print, printf

[root@centos8 ~]#awk '{print "hello,awk"}'
[root@centos8 ~]#seq 10 | awk '{print "hello,awk"}'
hello,awk
hello,awk
hello,awk
hello,awk
hello,awk
hello,awk
hello,awk
hello,awk
hello,awk
hello,awk
[root@centos8 ~]#seq 3 | awk '{print 2*3}'
6
6
6
[root@centos8 ~]#awk -F: '{print "wang"}' /etc/passwd  #有多少行就打印多少個wang
[root@centos8 ~]#awk -F: '{print}' /etc/passwd
[root@centos8 ~]#awk -F: '{print $0}' /etc/passwd
[root@centos8 ~]#awk -F: '{print $1,$3}' /etc/passwd
[root@centos8 ~]#awk -F: '{print $1"\t"$3}' /etc/passwd

[root@centos8 ~]#grep "^UUID" /etc/fstab |awk {'print $2,$3'}
/ xfs
/boot ext4
/data xfs
swap swap

awk**變量**

常見的內置變量

文本編輯命令和三劍客
19.jpg

FS:輸入字段分隔符,默認爲空白字符,功能至關於 -F
awk -v FS=':' '{print $1,FS,$3}' /etc/passwd
awk -v FS=":" '{print $1FS$3}' /etc/passwd
awk –F:   '{print $1,$3,$7}'   /etc/passwd 
S=:;awk -v FS=$S '{print $1FS$3}' /etc/passwd
[root@centos8 ~]#awk -v FS=":" '{print $1FS$3}' /etc/passwd |head -n3
root:0
bin:1
daemon:2
[root@centos8 ~]#S=:;awk -F$S   '{print $1,$3}' /etc/passwd|head -n3
root 0
bin 1
daemon 2
[root@centos8 ~]#
#-F 和 FS變量功能同樣,同時使用會衝突
[root@centos8 ~]#awk -v FS=":" -F";" '{print $1FS$3}' /etc/passwd |head -n3
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@centos8 ~]#awk -F";" -v FS=":" '{print $1FS$3}' /etc/passwd |head -n3
root:0
bin:1
daemon:2
[root@centos8 ~]#
OFS:輸出字段分隔符,默認爲空白字符
[root@centos8 ~]#awk -v FS=':'   '{print $1,$3,$7}'   /etc/passwd|head -n1
root 0 /bin/bash
[root@centos8 ~]#awk -v FS=':' -v OFS=':' '{print $1,$3,$7}'   
/etc/passwd|head -n1
root:0:/bin/bash
RS:輸入記錄record分隔符,指定輸入時的換行符
awk -v RS=' ' ‘{print }’ /etc/passwd
ORS:輸出記錄分隔符,輸出時用指定符號代替換行符
awk -v RS=' ' -v ORS='###' '{print $0}' /etc/passwd
NF:字段數量
#引用變量時,變量前不需加$
[root@centos8 ~]#awk -F: '{print NF}' /etc/passwd      #打印每一行有多少字段
[root@centos8 ~]#awk -F: '{print $(NF-1)}' /etc/passwd    #打印每一行的倒數第二段
[root@centos8 ~]#ls /misc/cd/BaseOS/Packages/*.rpm |awk -F"." '{print $(NF-
1)}'|sort |uniq -c
    389 i686
    208 noarch
   1060 x86_64
NR:記錄的編號
[root@centos8 ~]#awk '{print NR,$0}' /etc/issue /etc/centos-release
1 \S
2 Kernel \r on an \m
3 
4 CentOS Linux release 8.1.1911 (Core)

取ifconfig輸出結果中的IP地址
[root@centos8 ~]#ifconfig eth0 | awk '/netmask/{print $2}'
10.0.0.8
[root@centos8 ~]#ifconfig eth0 | awk 'NR==2{print $2}'
10.0.0.8
[root@centos8 ~]#awk -F: '{print NR}' /etc/passwd   打印每一行的行號
1  
2
3
.......
[root@centos8 ~]#awk -F: 'END{print NR}' /etc/passwd
57
[root@centos8 ~]#awk -F: 'BEGIN{print NR}' /etc/passwd
0
FNR:各文件分別計數,記錄的編號
awk '{print FNR}' /etc/fstab /etc/inittab
[root@centos8 ~]#awk '{print NR,$0}' /etc/issue /etc/redhat-release 
1 \S
2 Kernel \r on an \m
34 CentOS Linux release 8.0.1905 (Core) 
[root@centos8 script40]#awk '{print FNR,$0}' /etc/issue /etc/redhat-release 
1 \S
2 Kernel \r on an \m
31 CentOS Linux release 8.0.1905 (Core)
FILENAME:當前文件名
[root@centos8 ~]#awk '{print FILENAME}' /etc/fstab
[root@centos8 ~]#awk '{print FNR,FILENAME,$0}' /etc/issue /etc/redhat-release 
1 /etc/issue \S
2 /etc/issue Kernel \r on an \m
3 /etc/issue 
1 /etc/redhat-release CentOS Linux release 8.0.1905 (Core)
ARGC:命令行參數的個數
[root@centos8 ~]#awk '{print ARGC}' /etc/issue /etc/redhat-release 
3
3
3
3
[root@centos8 ~]#awk 'BEGIN{print ARGC}' /etc/issue /etc/redhat-release 
3
ARGV:數組,保存的是命令行所給定的各參數,每個參數:ARGV[0],......
範例
[root@centos8 ~]#awk 'BEGIN{print ARGV[0]}' /etc/issue /etc/redhat-release 
awk
[root@centos8 ~]#awk 'BEGIN{print ARGV[1]}' /etc/issue /etc/redhat-release 
/etc/issue
[root@centos8 ~]#awk 'BEGIN{print ARGV[2]}' /etc/issue /etc/redhat-release 
/etc/redhat-release
[root@centos8 ~]#awk 'BEGIN{print ARGV[3]}' /etc/issue /etc/redhat-release 
[root@centos8 ~]#

自定義變量(區分字符大小寫)

[root11:17 AMcentos8 ~]#awk -v test='hello' '{print test}' /etc/passwd     # passwd有多少行就打印多少個hello

[root11:20 AMcentos8 ~]#awk -v test='hello' 'BEGIN{print test}' /etc/passwd   #不重複打印
hello

[root11:24 AMcentos8 ~]#awk -F: '{sex="male";print $1,sex,age;age=18}' /etc/passwd
cat awkscript
{print script,$1,$2}
awk  -F: -f awkscript script="awk" /etc/passwd

文本編輯命令和三劍客
17.jpg

動做 printf

逗號分隔符

輸出item能夠字符串,也但是數值;當前記錄的字段、變量或awk的表達式

如省略item,至關於print $0

固定字符符須要用「 」 引發來,而變量和數字不須要

printf 能夠實現格式化輸出
printf 「FORMAT」, item1, item2, ...
說明:
必須指定FORMAT
不會自動換行,須要顯式給出換行控制符 \n
FORMAT中須要分別爲後面每一個item指定格式符
格式符:與item一一對應
%c:顯示字符的ASCII碼
%d, %i:顯示十進制整數
%e, %E:顯示科學計數法數值
%f:顯示爲浮點數
%g, %G:以科學計數法或浮點形式顯示數值
%s:顯示字符串
%u:無符號整數
%%:顯示%自身
#修飾符
#[.#] 第一個數字控制顯示的寬度;第二個#表示小數點後精度,如:%3.1f
- 左對齊(默認右對齊) 如:%-15s
+   顯示數值的正負符號   如:%+d
[root11:44 AMcentos8 ~]#awk -F: '{printf "username: %-25sUID:%d\n",$1,$3}' /etc/passwd

文本編輯命令和三劍客
18.jpg

操做符

算術操做符:

x+y, x-y, x*y, x/y, x^y, x%y
-x:轉換爲負數
+x:將字符串轉換爲數值

字符串操做符:沒有符號的操做符,字符串鏈接

賦值操做符:

=, +=, -=, *=, /=, %=, ^=,++, --
[root04:39 PMcentos7 ~]#awk -v n=0 '!n++' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root04:39 PMcentos7 ~]#awk -v n=1 '!n++' /etc/passwd
[root04:39 PMcentos7 ~]#awk 'BEGIN{i=0;print ++i,i}' /etc/passwd
1 1
[root04:41 PMcentos7 ~]#awk 'BEGIN{i=0;print i++,i}' /etc/passwd
0 1

文本編輯命令和三劍客

文本編輯命令和三劍客

文本編輯命令和三劍客

20.jpg21.jpg22.jpg

比較操做符:

==, !=, >, >=, <, <=

文本編輯命令和三劍客
23.jpg

取奇,偶數行

[root05:32 PMcentos7 ~]#seq 10 |awk 'NR%2==0'
2
4
6
8
10
[root05:32 PMcentos7 ~]#seq 10 |awk 'NR%2!=0'
1
3
5
7
9

模式匹配符:

[root05:37 PMcentos7 ~]#awk -F":"    '$0 !~/root/{print $1}'  /etc/passwd    取反
bin

文本編輯命令和三劍客
24.jpg

取磁盤利用率

[root05:41 PMcentos7 ~]#df | awk -F"[[:space:]]+|%" '$0 ~ /^\/dev\/sd/{print $5}'
8
8
1
1

取IP

[root@centos8 ~]#ifconfig eth0 | awk 'NR==2{print $2}'
10.0.0.8

邏輯表達式

awk -F:   '$3>=0 && $3<=1000 {print $1,$3}' /etc/passwd
awk -F:   '$3==0 || $3>=1000 {print $1,$3}' /etc/passwd 
awk -F:   '!($3==0) {print $1,$3}'     /etc/passwd
awk -F:   '!($3>=500) {print $1,$3}' /etc/passwd

條件表達式(三目表達式)

selector?if-true-expression:if-false-expression

[root06:01 PMcentos7 ~]#awk -F: '{$3>=1000?usertype="Common User":usertype="SysUser";printf "%-10s %35s\n", $1,usertype}' /etc/passwd

模式**PATTERN**

PATTERN:根據pattern條件,過濾匹配的行,再作處理

  1. 若是未指定:空模式,匹配每一行
[root@centos8 ~]#awk -F: '{print $1,$3}' /etc/passwd
  1. /regular expression/:僅處理可以模式匹配到的行,須要用/ /括起來
[root@centos8 ~]#awk   '/^UUID/{print $1}'     /etc/fstab
[root@centos8 ~]#awk   '!/^UUID/{print $1}'   /etc/fstab
[root@centos8 ~]#df | awk '/^\/dev\/sd/'
/dev/sda2      104806400 4935924  99870476   5% /
/dev/sda3       52403200  398876  52004324   1% /data
/dev/sda1         999320  848572     81936  92% /boot

relational expression: 關係表達式,結果爲「真」纔會被處理

真:結果爲非0值,非空字符串

假:結果爲空字符串或0值

[root06:09 PMcentos7 ~]#
[root06:09 PMcentos7 ~]#awk '"0"' /etc/issue      #0被當作字符串了
\S

Kernel \r on an \m

文本編輯命令和三劍客
25.jpg

文本編輯命令和三劍客
26.jpg

Awk  -F: '$3>=1000{print $1,$3}' /etc/passwd
awk  -F: '$3<1000{print $1,$3}' /etc/passwd
awk  -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
[root@centos8 ~]#awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
root /bin/bash
wang /bin/bash
mage /bin/bash
[root@centos8 ~]#awk -F: '$NF ~ /bash$/{print $1,$NF}' /etc/passwd
root /bin/bash
wang /bin/bash
mage /bin/bash

line ranges:行範圍

不支持直接用行號,但可使用變量NR間接指定行號

/pat1/,/pat2/ 不支持直接給出數字格式

[root@centos8 ~]#seq 10 | awk 'NR>=3 && NR<=6'
3456
[root@centos8 ~]#awk 'NR>=3 && NR<=6{print NR,$0}' /etc/passwd
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
[root@centos8 ~]#sed -n '3,6p' /etc/passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
[root@centos8 ~]#awk '/^bin/,/^adm/' /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@centos8 ~]#sed -n '/^bin/,/^adm/p' /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

BEGIN/END模式

BEGIN{}:僅在開始處理文件中的文本以前執行一次

END{}:僅在文本處理完成以後執行一次

[root06:33 PMcentos7 ~]#awk -F: 'BEGIN{print "USER UID \n--------------- "}{print $1,$3}' /etc/passwd

[root06:38 PMcentos7 ~]#awk -F: 'BEGIN{print "USER UID \n--------"}{print $1,$3}END{print "=========="}' /etc/passwd

打印奇數和偶數行

文本編輯命令和三劍客

文本編輯命令和三劍客
27.jpg

28.jpg

[root06:53 PMcentos7 ~]#seq 10 | awk  '{i=!i;print i}'
1
0
1
0
1
0
1
0
1
0

條件判斷 if-else

語法

if(condition){statement;…}[else statement]
if(condition1){statement1}else if(condition2){statement2}else if(condition3)
{statement3}......else{statementN}

使用場景:對awk取得的整行或某個字段作條件判斷

[root06:54 PMcentos7 ~]#awk -F: '{if($3>=1000)print $1,$3}' /etc/passwd

[root06:58 PMcentos7 ~]#awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd

awk '{if(NF>5) print $0}' /etc/fstab

awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}' /etc/passwd

awk -F: '{if($3>=1000) printf "Common user: %s\n",$1; else printf "root or 
Sysuser: %s\n",$1}' /etc/passwd

df -h|awk -F% '/^\/dev\/sd/{print $1}'| awk '$NF>=80{print $1,$5}'

df | awk -F"[[:space:]]+|%" '/^\/dev\/sd/{if($5>80)print $1,$5}'

[root@centos8 ~]#df | awk -F' +|%' '/^\/dev\/sd/{if($5>=10)print $1,$5}'
/dev/sda1 15

awk 'BEGIN{ test=100;if(test>90){print "very good"}else if(test>60){ print "good"}else{print "no pass"}}'

文本編輯命令和三劍客

29.jpg

內置函數length()返回字符數,而非字節數

[root@centos8 ~]#awk 'BEGIN{print length("hello")}'
5
[root@centos8 ~]#awk 'BEGIN{print length("馬哥教育")}'
4

#顯示每一個字段的長度
[root@centos7 ~]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){print $i,length($i); i++}}' /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-1062.el7.x86_64 31
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
net.ifnames=0 13
linux16 7
/vmlinuz-0-rescue-b12558570741487c9328c996e3265b09 50
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
net.ifnames=0 13
[root@centos7 ~]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=10){print $i,length($i)}; i++}}' /etc/grub2.cfg
/vmlinuz-3.10.0-1062.el7.x86_64 31
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
crashkernel=auto 16
net.ifnames=0 13
/vmlinuz-0-rescue-b12558570741487c9328c996e3265b09 50
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
crashkernel=auto 16
net.ifnames=0 13
[root@centos8 ~]#awk 'BEGIN{ total=0;i=1;while(i<=100){total+=i;i++};print 
total}'
5050

性能比較

# AWK是一條命令解決的,for是多條命令的組合解決的

[root08:02 PMcentos8 /tmp]#time (awk 'BEGIN{sum=0;i=1;while(i<=100000){sum+=i;i++};print sum}')
5000050000

real    0m0.007s
user    0m0.006s
sys 0m0.001s
[root08:02 PMcentos8 /tmp]#

[root07:59 PMcentos8 /tmp]#time (for i in {1..100000};do let sum+=$i;done;echo $sum)
5000050000

real    0m0.347s
user    0m0.339s
sys 0m0.003s

[root08:05 PMcentos8 /tmp]#time (seq -s+ 100000 |bc )
5000050000

real    0m0.036s
user    0m0.032s
sys 0m0.002s

continue和break

continue 中斷本次循環

break 中斷整個循環

continue [n]
break [n]
#奇數和
[root@centos8 ~]#awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0)continue;sum+=i}print sum}'
2500

#求1到49 之和
[root@centos8 ~]#awk 'BEGIN{sum=0;for(i=1;i<=100;i++)
{if(i==50)break;sum+=i}print sum}'
1225

文本編輯命令和三劍客
30.jpg

do-while

do {statement;…}while(condition)
意義:不管真假,至少執行一次循環體
do-while循環
語法:do {statement;…}while(condition)
意義:不管真假,至少執行一次循環體

[root@centos8 ~]#awk 'BEGIN{ total=0;i=1;do{ total+=i;i++;}while(i<=100);print 
total}'
5050

循環 for

for(expr1;expr2;expr3) {statement;…}

for(variable assignment;condition;iteration process) {for-body}

[root@centos8 ~]#awk 'BEGIN{total=0;for(i=1;i<=100;i++){total+=i};print total}'
5050

特殊用法:可以遍歷數組中的元素

for(var in array) {for-body}

next

next 能夠提早結束對本行處理而直接進入下一行處理(awk自身循環)

範例:

#看到奇數就跳過

[root@centos8 ~]#awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
root 0
daemon 2
lp 4
shutdown 6
mail 8
games 12
ftp 14
nobody 65534
polkitd 998
gluster 996
rtkit 172
rpc 32
chrony 994
saslauth 992
clevis 984
pegasus 66
colord 982
setroubleshoot 980
gdm 42
gnome-initial-setup 978
sshd 74
avahi 70
tcpdump 72
wang 1000

數組 重點難點

awk的數組爲關聯數組

weekdays["mon"]="Monday"

index-expression

利用數組,實現 k/v 功能

可以使用任意字符串;字符串要使用雙引號括起來

若是某數組元素事先不存在,在引用時,awk會自動建立此元素,並將其值初始化爲「空串」

若要判斷數組中是否存在某元素,要使用「index in array」格式進行遍歷

[root08:35 PMcentos8 /tmp]#awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}'
Tuesday
Monday

文本編輯命令和三劍客
31.jpg

判斷數組索引是否存在

[root@centos8 ~]# awk 'BEGIN{array["i"]="x"; array["j"]="y" ; print "i" in 
array, "y" in array }'
1 0
[root@centos8 ~]#awk 'BEGIN{array["i"]="x"; array["j"]="y" ;if ("i" in array ) 
{print "存在"}else{print "不存在"}}'
存在
[root@centos8 ~]#awk 'BEGIN{array["i"]="x"; array["j"]="y" ;if ("abc" in array ) 
{print "存在"}else{print "不存在"}}

若要遍歷數組中的每一個元素,要使用for循環

for(var in array) {for-body}

注意:var會遍歷array的每一個索引

範例:遍歷數組

[root@centos8 ~]#awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}'
Tuesday
Monday
[root@centos8 ~]#awk 'BEGIN{students[1]="daizong";students[2]="junzong";students[3]="kunzong";for(x 
in students){print x":"students[x]}}'
1:daizong
2:junzong
3:kunzong
[root@centos8 ~]#awk 'BEGIN {
a["x"] = "welcome"
a["y"] = "to"
a["z"] = "Magedu"
for (i in a) {
     print i,a[i]
}}'
x welcome
y to
z Magedu
[root@centos8 ~]#awk -F: '{user[$1]=$3}END{for(i in user){print "username: "i,"uid: "user[i]}}' /etc/passwd
username: adm uid: 3
username: rpc uid: 32
username: dnsmasq uid: 985
username: radvd uid: 75
username: sync uid: 5
username: mail uid: 8
username: exim uid: 93
username: tss uid: 59
username: gluster uid: 996
username: unbound uid: 995
username: halt uid: 7

顯示主機的鏈接狀態出現的次數

文本編輯命令和三劍客
32.jpg

[root@centos8 ~]#awk 'NR!=1{print $1}' ss.log |sort |uniq -c
    118 ESTAB
      1 FIN-WAIT-1
     11 LAST-ACK
[root@centos8 ~]#cat ss.log | sed -nr '1!s/^([^0-9]+) .*/\1/p'|sort |uniq -c
    529 ESTAB    
      9 LISTEN   
    128 SYN-RECV 
     95 TIME-WAIT
     
[root@centos8 ~]#ss -ant | awk 'NR!=1{state[$1]++}END{for(i in state){print 
i,state[i]}}'
SYN-RECV 128
LISTEN 9
ESTAB 529
TIME-WAIT 95
[root@centos8 ~]#netstat -tan | awk '/^tcp/{state[$NF]++}END{for(i in state)
{print i,state[i]}}'
LISTEN 9
SYN_RECV 126
ESTABLISHED 523
FIN_WAIT2 40

文本編輯命令和三劍客
33.jpg

awk 調用shell命令

鏈接次數超過1000就拒絕

文本編輯命令和三劍客
34.jpg

封掉查看訪問日誌中鏈接次數超過1000次的IP

[root@centos8 ~]#awk '{ip[$1]++}END{for(i in ip){if(ip[i]>=1000){system("iptables -A INPUT -s "i" -j REJECT")}}}' nginx.access.log-20200428

多維數組

一個數組有兩個下標

[root@centos8 ~]#awk 'BEGIN{
> array[1][1]=11
> array[1][2]=12
> array[1][3]=13
> array[2][1]=21
> array[2][2]=22
> array[2][3]=23
> for (i in array)
>     for (j in array[i])
>         print array[i][j]
> }'
11
12
13
21
22
23

常見內置函數

數值處理:

rand():返回0和1之間一個隨機數

srand():配合rand() 函數,生成隨機數的種子

int():返回整數

[root@centos8 ~]#awk 'BEGIN{srand();print rand()}'   #輸出小於1的隨機數
0.790437
[root@centos8 ~]#awk 'BEGIN{srand();print rand()}'
0.283736
[root@centos8 ~]#awk 'BEGIN{srand();print rand()}'
0.948082
[root@centos8 ~]#awk 'BEGIN{srand();print rand()}'
0.371798
[root@centos8 ~]#awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) 
}' 
35
17
35
95
19
15
70
54
46
93

字符串處理:

length([s]):返回指定字符串的長度

sub(r,s,[t]):對t字符串搜索r表示模式匹配的內容,並將第一個匹配內容替換爲s

範例:

[root@centos8 ~]#echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$1)'
2008-08:08 08:08:08
[root@centos8 ~]#echo "2008:08:08 08:08:08" | awk '{sub(/:/,"-",$1);print $0}'
2008-08:08 08:08:08

gsub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,並所有替換爲s所表示的內容

範例:

[root10:32 PMcentos8 /tmp]#echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$1)'
2008-08:08 08:08:08

[root10:33 PMcentos8 /tmp]#echo "2008:08:08 08:08:08" | awk '{gsub(/:/,"-",$0);print $0}'
2008-08-08 08-08-08

[root10:35 PMcentos8 /tmp]#echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-",$0){print $0}'
2008-08-08 08-08-08

split(s,array,[r]):以r爲分隔符,切割字符串s,並將切割後的結果保存至array所表示的數組中,第一個

索引值爲1,第二個索引值爲2,…

[root10:40 PMcentos8 /tmp]#netstat -tn 
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0     36 10.0.0.130:22           10.0.0.1:51452          ESTABLISHED

[root@centos8 ~]#netstat -tn | awk '/^tcp/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}'
10.0.0.1 1
10.0.0.6 1
10.0.0.7 673

system 函數:能夠awk中調用shell命令

空格是awk中的字符串鏈接符,若是system中須要使用awk中的變量可使用空格分隔,或者說除了

awk的變量外其餘一概用""引用起來

awk 'BEGIN{system("hostname")}'

awk 'BEGIN{score=100; system("echo your score is " score) }'

[rootentos8 ]#netstat -tn | awk '/^tcp/{split($5,ip,":");count[ip[1]]++}END{for(i in count){if(count[i]>=10){system("iptables -A INPUT -s "i" -j REJECT")}}}'

自定義函數

自定義函數格式:

function name ( parameter, parameter, ... ) {
   statements
   return expression
}

範例:

[root@centos8 ~]#cat func.awk
function max(x,y) {
 x>y?var=x:var=y
 return var
}
BEGIN{print max(a,b)}
[root@centos8 ~]#awk -v a=30 -v b=20 -f func.awk
30

awk**腳本**

將awk程序寫成腳本,直接調用或執行

[root@centos8 ~]#cat passwd.awk 
{if($3>=1000)print $1,$3}
[root@centos8 ~]#awk -F: -f passwd.awk /etc/passwd
nobody 65534
wang 1000
mage 1001

向awk腳本傳遞參數

awkfile var=value var2=value2... Inputfile

注意:在BEGIN過程當中不可用。直到首行輸入完成之後,變量纔可用。能夠經過-v 參數,讓awk在執行

BEGIN以前獲得變量的值。命令行中每個指定的變量都須要一個-v參數

範例:

[root@centos8 ~]#cat test2.awk 
#!/bin/awk -f
{if($3 >=min && $3<=max)print $1,$3} 
[root@centos8 ~]#chmod +x test2.awk
[root@centos8 ~]#./test2.awk -F: min=100 max=200 /etc/passwd
systemd-resolve 193
rtkit 172
pulse 171
qemu 107
usbmuxd 113
abrt 173

練習

一、文件host_list.log 以下格式,請提取」.magedu.com」前面的主機名部分並寫入到回到該文件中

1 www.magedu.com

2 blog.magedu.com

3 study.magedu.com

4 linux.magedu.com

5 python.magedu.com

......

999 study.magedu.com

[root07:16 AMcentos8 ~]#awk -F" +|[.]" '{print $2}' host_list.log  >>host_list.log

二、統計/etc/fstab文件中每一個文件系統類型出現的次數

[root11:31 PMcentos8 ~]#awk '/^[^#]/{file[$3]++}END{for(i in file)printf "文件系統類型:%s 個數:%s\n", i, file[i]}' /etc/fstab 
文件系統類型:swap 個數:1
文件系統類型:ext4 個數:1
文件系統類型:xfs 個數:2

三、統計/etc/fstab文件中每一個單詞出現的次數

[root11:39 PMcentos8 ~]#grep -Eo '\<[[:alpha:]]+\>'  /etc/fstab  |sort |uniq -c

[root12:01 AMcentos8 ~]#awk '{for(i=1;i<=NF;i++){counts[$i]++}}END{for(j in counts){print j, counts[j]}}' /etc/fstab |wc -l

四、提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的全部數字

[root12:17 AMcentos8 ~]#echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | awk '{gsub(/[^0-9]/,"",$0);print $0}'
05973
或者方法二:
echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | tr 'a-z' 'A-Z' | awk -F "[A-Z]|[%&@+]" '{for (i=1;i<=NF;i++){print $i}}' | tr -s "\n"

五、有一文件記錄了1-100000之間隨機的整數共5000個,存儲的格式100,50,35,89…請取出其中最大和

最小的整數

 
 

六、解決Dos***生產案例:根據web日誌或者或者網絡鏈接數,監控當某個IP併發鏈接數或者短時內

PV達到100,即調用防火牆命令封掉對應的IP,監控頻率每隔5分鐘。防火牆命令爲:iptables -A

INPUT -s IP -j REJECT七、將如下文件內容中FQDN取出並根據其進行計數從高到低排序

[root07:37 AMcentos8 ~]#ss -nt | awk -F " +|:" '{ip[$4]++}END{for(i in ip){if(ip[i]>100){system("iptables -A INPUT -s "i" -j REJECT")}}}'

7.將如下文件內容中FQDN取出並根據其進行計數從高到低排序

http://mail.magedu.com/index.html

http://www.magedu.com/test.html

http://study.magedu.com/index.html

http://blog.magedu.com/index.html

http://www.magedu.com/images/logo.jpg

http://blog.magedu.com/20080102.html

http://www.magedu.com/images/magedu.jpg

參考答案:

~~~相、

[root@centos8 ~]#awk -F"/" '{url[$3]++}END{for(i in url){print url[i],i}}'

url.log |sort -nr

3 www.magedu.com

2 blog.magedu.com

1 study.magedu.com

1 mail.magedu.com

八、將如下文本以inode爲標記,對inode相同的counts進行累加,而且統計出同一inode中,

beginnumber的最小值和endnumber的最大值

inode|beginnumber|endnumber|counts|

106|3363120000|3363129999|10000|

106|3368560000|3368579999|20000|

310|3337000000|3337000100|101|

310|3342950000|3342959999|10000|

310|3362120960|3362120961|2|

311|3313460102|3313469999|9898|

311|3313470000|3313499999|30000|

311|3362120962|3362120963|2|

輸出的結果格式爲:

310|3337000000|3362120961|10103|

311|3313460102|3362120963|39900|

106|3363120000|3368579999|30000|

~~~bash
[root07:47 AMcentos8 ~]#cat sd
inode|beginnumber|endnumber|counts| 
106|3363120000|3363129999|10000| 
106|3368560000|3368579999|20000| 
310|3337000000|3337000100|101| 
310|3342950000|3342959999|10000| 
310|3362120960|3362120961|2| 
311|3313460102|3313469999|9898| 
311|3313470000|3313499999|30000| 
311|3362120962|3362120963|2| 
[root07:47 AMcentos8 ~]#awk -F "|" '/^[^i]/{inode[$1]++;if(0){begin[$1]=$2}else if(begin[$1]>$2){begin[$1]=$2};if(end[$1]<$3){end[$1]=$3};count[$1]+=$(NF-1)}END{for (i in inode){print i,begin[i],end[i],count[i]}}' sd
106  3368579999 30000
310  3362120961 10103
311  3362120963 39900
相關文章
相關標籤/搜索