Linux文本处理三剑客:awk、sed、grep

免责声明

本文仅作分享,内容参考使用。


目录

免责声明

awk

用法

工作模式

指定分隔符

分段

NF

NR

pattern

[BEGIN END](#BEGIN END)

计算

if

变量

for

正则

简单总结

sed

用法

替换:

正则表达式

工作模式

选项

显示某一行文件

[d 的用法](#d 的用法)

[a c i](#a c i)

删除注释

引用外部变量

后向引用

tr

例:

批量重命名

grep

用法

模式选择与解释

其他选项

输出控制

上下文控制

其他说明


awk

AWK是一个优良的++文本处理++ 工具,LinuxUnix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯、彼得·温伯格和布莱恩·柯林汉姓氏的首个字母)的最大功能取决于一个人所拥有的知识。awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源(ls -l /bin/awk )

Awk_百度百科

文本处理最niu


用法

awk [POSIX 或 GNU 风格选项] -f 程序文件 [--] 文件 ...
awk [POSIX 或 GNU 风格选项] [--] '程序' 文件 ...

POSIX 选项 :| GNU 长选项:(标准)

  • -f 程序文件 | --file=程序文件

  • -F 分隔符 | --field-separator=分隔符

  • -v 变量=值 | --assign=变量=值

简短选项 :| GNU 长选项:(扩展)

  • -b | --characters-as-bytes

  • -c | --traditional

  • -C | --copyright

  • -d[文件] | --dump-variables[=文件]

  • -D[文件] | --debug[=文件]

  • -e '程序文本' | --source='程序文本'

  • -E 文件 | --exec=文件

  • -g | --gen-pot

  • -h | --help

  • -i 包含文件 | --include=包含文件

  • -I | --trace

  • -l 库 | --load=库

  • -L[严重|无效|无扩展] | --lint[=严重|无效|无扩展]

  • -M | --bignum

  • -N | --use-lc-numeric

  • -n | --non-decimal-data

  • -o[文件] | --pretty-print[=文件]

  • -O | --optimize

  • -p[文件] | --profile[=文件]

  • -P | --posix

  • -r | --re-interval

  • -s | --no-optimize

  • -S | --sandbox

  • -t | --lint-old

  • -V | --version

报告错误

  • 使用 gawkbug 程序报告错误。

  • 详细的报告指南请参阅 gawk.info 中的 Bugs 节点,或访问 GNU Gawk 手册

注意

  • 请不要通过在 comp.lang.awk 发帖或使用 Stack Overflow 等网络论坛来报告错误。

关于 gawk

  • gawk 是一种模式扫描和处理语言,默认情况下,它从标准输入读取数据,并将结果输出到标准输出。

示例

awk '{ sum += $1 }; END { print sum }' file
awk -F: '{ print $1 }' /etc/passwd

awk 默认以空白为分隔符。

就用单引号 awk '{print $1}' a1.txt

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# ll /usr/bin/awk 
lrwxrwxrwx 1 root root 21 Jan 26  2024 /usr/bin/awk -> /etc/alternatives/awk
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# ll /etc/alternatives/awk   
lrwxrwxrwx 1 root root 13 Dec 11 21:34 /etc/alternatives/awk -> /usr/bin/gawk

工作模式

读每一行,执行命令 (++一行一行++)

pattern action

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt 
ss 270947109 90 99
ll 920220920 90 90
dd 248727428 88 89
da 248972998 89 89
ds 284782947 89 89
ks 247824782 98 89

字段,
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{print $1}' a1.txt
ss
ll
dd
da
ds
ks
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{print $2}' a1.txt
270947109
920220920
248727428
248972998
284782947
247824782

指定分隔符

指定多个分隔符

-F

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# tail -3 /etc/passwd
nm-openvpn:x:130:133:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
nm-openconnect:x:131:134:NetworkManager OpenConnect plugin,,,:/var/lib/NetworkManager:/usr/sbin/nologin
kali:x:1000:1000:kali,,,:/home/kali:/usr/bin/zsh


                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# tail -3 /etc/passwd| awk -F ':' '{print $1}' 
nm-openvpn
nm-openconnect
kali


如果有多个,则用一个去处理,[ :]+ 将多个空格或:都看成一个。
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt
ss::270947109 90 99
ll:920220920 90 90
dd:248727428 88 89
da 248972998 89 89
ds 284782947 89 89
ks 247824782 98 89
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk -F'[ :]+' '{print $2}' a1.txt
270947109
920220920
248727428
248972998
284782947
247824782


┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt
ss::    270947109 90 99
ll:920220920 90 90
dd:248727428 88 89
da      248972998 89 89
ds 284782947 89 89
ks 247824782 98 89
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk -F'[ :]+' '{print $2}' a1.txt
        270947109
920220920
248727428
        248972998
284782947
247824782
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk -F'[ :\t]+' '{print $2}' a1.txt
270947109
920220920
248727428
248972998
284782947
247824782


分清楚以什么为分割
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a2.txt | grep 'inet'
        inet 192.168.54.129  netmask 255.255.255.0  broadcast 192.168.54.255
        inet6 fe80::20c:29ff:fe32:5622  prefixlen 64  scopeid 0x20<link>
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a2.txt | grep 'inet'|awk -F'[\t ]+' '{print $3}'
192.168.54.129
fe80::20c:29ff:fe32:5622
127.0.0.1
::1

分段

取多段 ,

"" 可加任何东西

'{print $2"+++"$1,$3"---"$4}'

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk -F'[ :\t]+' '{print $2"+++"$1,$3"---"$4}' a1.txt 
270947109+++ss 90---99
920220920+++ll 90---90
248727428+++dd 88---89
248972998+++da 89---89
284782947+++ds 89---89
247824782+++ks 98---89

NF

字段,number of fileds

awk内置变量

$NF 就是取最后一列

'{print $NF}'

'{print $(NF-1)}'

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt
ss 270947109 90 99
ll 920220920 90 90
dd 248727428 88 89
da 248972998 89 89
ds 284782947 89 89
ks 247824782 98 89
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk  '{print $NF}' a1.txt
99
90
89
89
89
89
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk  '{print NF}' a1.txt 
4
4
4
4
4
4

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk  '{print $(NF-2)}' a1.txt
270947109
920220920
248727428
248972998
284782947
247824782

NR

行数,不重查

FNR 重查, (多个文件时)

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk  '{print NR,$(NF-2)}' a1.txt
1 270947109
2 920220920
3 248727428
4 248972998
5 284782947
6 247824782

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk  'NR==2{print $2}' a1.txt
920220920
                                                                                                                                                             
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk  'NR>2&&NR<5{print $2}' a1.txt
248727428
248972998

pattern

默认为真

pattern action ----》 一个pattern跟着一个action

'BEGIN {print "====id====="}{print $2}END{print "==========="}'

awk '条件{print $1}'

条件为真就执行后边命令,为假则不执行。

字符串为真

变量为假 (没赋值的)

awk '{a=1}a{print $1}' 执行


BEGIN END

BEGIN 一般给变量赋值

END 一般输出值

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk  'BEGIN{print "====id====="}{print $2}' a1.txt
====id=====
270947109
920220920
248727428
248972998
284782947
247824782

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk  'BEGIN{print "====id====="}{print $2}END{print "==========="}' a1.txt
====id=====
270947109
920220920
248727428
248972998
284782947
247824782
===========

计算

li:xxx cpu总

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{print $0,$3+$4,($3+$4)/2}' a1.txt
ss 270947109 90 99 189 94.5
ll 920220920 90 90 180 90
dd 248727428 88 89 177 88.5
da 248972998 89 89 178 89
ds 284782947 89 89 178 89
ks 247824782 98 89 187 93.5

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{a+=$3}END{print a}' a1.txt 
544

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{a+=$3;print $0}END{print a}' a1.txt
ss 270947109 90 99
ll 920220920 90 90
dd 248727428 88 89
da 248972998 89 89
ds 284782947 89 89
ks 247824782 98 89
544

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# ps aux | awk '{a+=$3}END{print a}' 
3.6

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# ps aux |grep /usr/ | awk '{a+=$3}END{print a}' 

2.4

if

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{if($3>=90){print $3}}' a1.txt
90
90
98

例子:文件大小

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{if($5>=200){print $5}}' l1.txt 
882
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{if($5>=200){print $0}}' l1.txt
-rw-r--r-- 1 root root 882 Jan 22 22:13 a2.txt

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat l1.txt 
total 16
-rw-r--r-- 1 root root 104 Jan 22 21:17 3.txt
-rw-r--r-- 1 root root 113 Jan 22 21:30 31.txt
-rw-r--r-- 1 root root 114 Jan 22 22:22 a1.txt
-rw-r--r-- 1 root root 882 Jan 22 22:13 a2.txt
-rw-r--r-- 1 root root   0 Jan 23 04:54 l1.txt


'/^-/{if($5>=200){print $0}}' 里面时正则表达式。
┌──(root㉿kali)-[/home/kali/Desktop]
└─# awk '/^-/{if($5>=200){print $0}}' l2    
-rw-r--r--  1 root root     21372 Dec 13 01:55 011.txt
-rw-------  1 kali kali    164341 Sep 25  2015 Botnet.pcap
-rwxrw-rw-  1 kali kali     15294 Jan 19 21:30 SSRFX-master.zip
-rw-rw-r--  1 kali kali      2015 Dec 13 20:55 bot.txt
-rw-rw-r--  1 kali kali      2210 Dec 13 21:08 bot1.txt
-rwxrw-rw-  1 kali kali 629145600 Dec 15 09:35 easy_dump.img
-rw-------  1 kali kali     32878 Oct 11  2021 fetus_pcap.pcap
-rw-r--r--  1 root root       569 Jan 23 00:02 key.txt
-rw-rw-r--  1 kali kali       245 Dec 15 20:25 pas1.txt
-r-xr--r--  1 kali kali  24144055 Dec 16 04:30 volatility3.zip

变量

自己起尽量小写

2条语句用;隔开

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 3.txt 
hu hello hu
hu hello huhu
hu hello ddaidniad
djaooafn hello indaiondoia
xiao hello xiao
xioa hello xiao

直接赋值:
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{a=2;print a}' 3.txt 
2
2
2
2
2
2


-v 给变量赋值	
┌──(root㉿kali)-[/home/kali/Desktop/zz]	处理一行执行一次action
└─# awk -v a=2 '{print a}' 3.txt 
2
2
2
2
2
2
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk -v a=2 'BEGIN{print a}' 3.txt
2

for

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{for(i=1;i<NF;i++){print $i}}' a1.txt 
ss
270947109
90
ll
920220920
90
dd
248727428
88
da
248972998
89
ds
284782947
89
ks
247824782
98
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{for(i=1;i<NF-1;i++){print $i}}' a1.txt
ss
270947109
ll
920220920
dd
248727428
da
248972998
ds
284782947
ks
247824782
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{for(i=2;i<NF-1;i++){print $i}}' a1.txt
270947109
920220920
248727428
248972998
284782947
247824782

printf

print 就会输出一个换行(自带换行)

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{printf $1}' a1.txt
sslldddadsks                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{printf $1""}' a1.txt
sslldddadsks                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{printf $1" "}' a1.txt
ss ll dd da ds ks                                                                                                                                                              
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{printf $1" \n"}' a1.txt
ss 
ll 
dd 
da 
ds 
ks 

取奇数列:

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{print $1,$3}' a1.txt                               
ss 90
ll 90
dd 88
da 89
ds 89
ks 98
         

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{for(i=1;i<NF;i+=2){printf $i}}' a1.txt
ss90ll90dd88da89ds89ks98                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{for(i=1;i<NF;i+=2){printf $i" "}}' a1.txt
ss 90 ll 90 dd 88 da 89 ds 89 ks 98                                                                                                                                                              
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{for(i=1;i<NF;i+=2){printf $i" "}print xxoo}' a1.txt
ss 90 
ll 90 
dd 88 
da 89 
ds 89 
ks 98 

正则

'/^d/{print $0}'

/正则/

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '/^d/{print $0}' a1.txt
dd 248727428 88 89
da 248972998 89 89
ds 284782947 89 89

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '/d/{print $0}' a1.txt 
dd 248727428 88 89
da 248972998 89 89
ds 284782947 89 89

匹配
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '$NF~89{print $0}' a1.txt
dd 248727428 88 89
da 248972998 89 89
ds 284782947 89 89
ks 247824782 98 89

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '/d/&&$NF==89{print $0}' a1.txt
dd 248727428 88 89
da 248972998 89 89
ds 284782947 89 89

简单总结

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# who | awk '{n++}END{print n}' 
3

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '/^d/' a1.txt 
dd 248727428 88 89
da 248972998 89 89
ds 284782947 89 89

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '/^d/' a1.txt > a3    
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a3    
dd 248727428 88 89
da 248972998 89 89
ds 284782947 89 89

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{OFS=":"}{print $1,$2}' a1.txt
ss:270947109
ll:920220920
dd:248727428
da:248972998
ds:284782947
ks:247824782

RS 输入分隔符,直接不是一行一行处理了,

例子:

2段数据拼接

计算,多少个单词

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt                                                         
ss 270947109 90 99
ll 920220920 90 90
dd 248727428 88 89
da 248972998 89 89
ds 284782947 89 89
ks 247824782 98 89
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt |wc                                                     
      6      24     114
                                                                                                                                                             
for循环,循环每一行的每一个字段。                                                                                                                                                         
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{for(i=1;i<=NF;i++){n++}}END{print n}' a1.txt
24
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{for(i=1;i<=NF;i++){n++}print n}' a1.txt  
4
8
12
16
20
24
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# awk '{for(i=1;i<=NF;i++)if($i=="89"){n++}}END{print n}' a1.txt
6

加法:

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           385M  1.2M  383M   1% /run
/dev/sda1        48G   15G   31G  33% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           385M  124K  384M   1% /run/user/1000
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# df -hi
Filesystem     Inodes IUsed IFree IUse% Mounted on
udev             470K   421  470K    1% /dev
tmpfs            481K   725  480K    1% /run
/dev/sda1        3.1M  437K  2.7M   14% /
tmpfs            481K     1  481K    1% /dev/shm
tmpfs            481K     2  481K    1% /run/lock
tmpfs             97K   119   96K    1% /run/user/1000
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# df -h | awk '//{print $5}'
Use%
0%
1%
33%
0%
0%
1%
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# df -h | awk '/\/dev/{print $5}'
0%
33%
0%
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# df -h | awk '/^\/dev/{print $5}'
33%

=============
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# df -h |sed '1d'| awk -F'[% ]+' '//{print $5}'
0
1
33
0
0
1
                                                                                                                                                             
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# df -h |sed '1d'| awk -F'[% ]+' '//{a+=$5}END{print a}'
35

删除文件后4行:

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 10 | head -n -4
1
2
3
4
5
6
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 10 | awk 'NR==FNR{a++}NR!=FNR{if(FNR<=a-4)print $0}' 10 10
1
2
3
4
5
6

数组,函数......


sed

steam editor 依赖++正则表达式++

sed是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大。

SED(Linux指令)_百度百科

用法

sed [选项]... {仅在没有其他脚本时的脚本内容} [输入文件]...

选项说明:

  • -n, --quiet, --silent

    抑制模式空间的自动打印。

  • --debug

    注释程序执行过程。

  • -e 脚本, --expression=脚本

    将脚本添加到要执行的命令中。

  • -f 脚本文件, --file=脚本文件

    将脚本文件的内容添加到要执行的命令中。

  • --follow-symlinks

    在原地处理时,跟随符号链接。

  • -i[后缀], --in-place[=后缀]

    原地编辑文件(如果提供后缀,则创建备份)。

  • -l N, --line-length=N

    l 命令指定所需的行折行长度。

  • --posix

    禁用所有 GNU 扩展功能。

  • -E, -r, --regexp-extended

    在脚本中使用扩展正则表达式 (为保证移植性,请使用 POSIX 的 -E)。

  • -s, --separate

    将文件视为独立的,而不是一个连续的长流。

  • --sandbox

    以沙盒模式运行(禁用 erw 命令)。

  • -u, --unbuffered

    从输入文件中加载最少的数据,并更频繁地刷新输出缓冲区。

  • -z, --null-data

    使用 NUL 字符分隔行。

  • --help

    显示此帮助信息并退出。

  • --version

    输出版本信息并退出。

说明 : 如果未指定 -e--expression-f--file 选项,则第一个非选项参数将被视为要解释的 sed 脚本。所有剩余的参数都是输入文件的名称;如果未指定输入文件,则读取标准输入。


替换:

一般是将 模糊的字符 替换成 确定的字符。

sed 's/模糊/确定/g' (不能将模糊的东西替换成模糊的东西!)

s表示替换

sed ''
sed -r ''
替换:
──(root㉿kali)-[/home/kali/Desktop/zz]
└─# echo adoawdnaiowd909 | sed 's/909/123/g'
adoawdnaiowd123
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# echo adoawdnaiowd909 | sed 's/[0-9]\{3\}/123/g'
adoawdnaiowd123

删除:

-r 启用扩展正则

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# echo qqq111qqq |sed 's/111//'
qqqqqq
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# echo qqq111qqq |sed 's/111//g'
qqqqqq
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# echo qqq111qqq |sed 's/[0-9][0-9][0-9]//g'
qqqqqq
                                                                                                                                                           

                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# echo qqq111qqq |sed 's/[0-9]\{3\}//g'
qqqqqq
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# ping 10.210.1.103                    
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# echo qqq111qqq |sed -r 's/[0-9]{3}//g'
qqqqqq
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# echo qqq111qqq |sed -r 's/[0-9]{3}+//g'
qqqqqq

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# echo qqq111qqq |sed -r 's/[0-9]+//g'   
qqqqqq

正则表达式

^

$

  • 一次或多次

|

* 零次(空)或多次

[0-9a-z]

[ \t]

. 可以匹配任意一个字符(空格),但不能匹配空行。

.*

xxx{1}

(空格不算空行)cat -E xxx 看清晰一点

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -E s1                                                     
diawnoianfawopf$
awnfianfawopfm$
apnaofpaw$
$
anfoiafop$
 $
  $
fnaowfnoaw$
425829r-0k$
==awkfjpfma$
  ajpofmaf$
 apwjd am$
$

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -nE s2                
     1  $
     2                          $
     3  123$
     4  #123$
     5  $123$
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# grep -n '^$' s2 
1:
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# grep -n '.' s2 
2:                      
3:123
4:#123
5:$123
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# grep -n '^\$' s2
5:$123
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# grep -n '^[$]' s2
5:$123

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# grep -nE '^$|[ \t]+' s2
1:
2:    

工作模式

一行一行,每次读一行,执行操作

pattern space

hold space 缓冲区

不加g,替换一个
///
###
;;;
@@@
s后边的默认为分隔符。
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# echo 123djaiwoj123 |sed 's/123/456/'
456djaiwoj123
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# echo 123djaiwoj123 |sed 's/123/456/g'
456djaiwoj456

sed本身也可以过滤,不用grep。


选项

n e r f i

-e 仅限于替换,执行多条语句;连续执行多条命令

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt    
ss 270947109 90 99
ll 920220920 90 90
dd 248727428 88 89
da 248972998 89 89
ds 284782947 89 89
ks 247824782 98 89
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# 
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# sed -e 's/2/=/' -e 's/89/-/' a1.txt 
ss =70947109 90 99
ll 9=0220920 90 90
dd =48727428 88 -
da =4-72998 89 89
ds =84782947 - 89
ks =47824782 98 -

-f 从文本中替换

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# sed -f 1.sed a1.txt                
ss 20070647006 60 66
ll 62000200200062000 60 60
dd 200487200742008 88 86
da 2004867200668 86 86
ds 2008478200647 86 86
ks 200478200478200 68 86
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 1.sed                                                     
s/1/0/g
s/2/200/g
s/9/6/g

-n 取消默认输出(不输出)

与p一起连用,仅显示改动过的。

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt    
ss 270947109 90 99
ll 920220920 90 90
dd 248727428 88 89
da 248972998 89 89
ds 284782947 89 89
ks 247824782 98 89
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# sed 's/99/==/g' a1.txt                                
ss 270947109 90 ==
ll 920220920 90 90
dd 248727428 88 89
da 248972==8 89 89
ds 284782947 89 89
ks 247824782 98 89
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# sed -n 's/99/==/g' a1.txt
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# sed -n 's/99/==/gp' a1.txt
ss 270947109 90 ==
da 248972==8 89 89

-r 开扩展正则

-i 直接修改源文件


显示某一行文件

sed -n '4p'

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 2 | head -4           
dahodh=dadoianda
adhiaow1=1eu091u9
adahwod=109313
line1 = 13131
                                                                                                                                               
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 2 | head -4| tail -1
line1 = 13131
                                                                                                                                               
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# sed '4p' 2                
dahodh=dadoianda
adhiaow1=1eu091u9
adahwod=109313
line1 = 13131
line1 = 13131
ks=1111
iwah=1381903
ewew=11381093
dawd=1131
                                                                                                                                               
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2 |sed '4p' 
     1  dahodh=dadoianda
     2  adhiaow1=1eu091u9
     3  adahwod=109313
     4  line1 = 13131
     4  line1 = 13131
     5  ks=1111
     6  iwah=1381903
     7  ewew=11381093
     8  dawd=1131
                                                                                                                                               
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2 |sed -n '4p' 
     4  line1 = 13131

-n 取消默认输出

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2 |sed -n '4,6p' 
     4  line1 = 13131
     5  ks=1111
     6  iwah=1381903
                                                                                                                                               
                                                                                                                                               
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2 |sed -n '4,$p'  
     4  line1 = 13131
     5  ks=1111
     6  iwah=1381903
     7  ewew=11381093
     8  dawd=1131

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2 |sed -nr '4p;6p' 
     4  line1 = 13131
     6  iwah=1381903

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2                  
     1  dahodh=dadoianda
     2  adhiaow1=1eu091u9
     3  adahwod=109313
     4  line1 = 13131
     5  ks=1111
     6  iwah=1381903
     7  ewew=11381093
     8  dawd=1131
                                                                                                                                               
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2| sed '5s/=/+/g' 
     1  dahodh=dadoianda
     2  adhiaow1=1eu091u9
     3  adahwod=109313
     4  line1 = 13131
     5  ks+1111
     6  iwah=1381903
     7  ewew=11381093
     8  dawd=1131
                                                                                                                                               
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2| sed '5,$s/=/+/g'
     1  dahodh=dadoianda
     2  adhiaow1=1eu091u9
     3  adahwod=109313
     4  line1 = 13131
     5  ks+1111
     6  iwah+1381903
     7  ewew+11381093
     8  dawd+1131

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2| sed -n '5s/=/+/gp'
     5  ks+1111

d 的用法

删除 一整行

!d取反

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2 | sed '/11/d'
     1  dahodh=dadoianda
     2  adhiaow1=1eu091u9
     3  adahwod=109313
     4  line1 = 13131
     6  iwah=1381903

$ 表示最后一行

$p

(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2             
     1  dahodh=dadoianda
     2  adhiaow1=1eu091u9
     3  adahwod=109313
     4  line1 = 13131
     5  ks=1111
     6  iwah=1381903
     7  ewew=11381093
     8  dawd=1131
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2| sed '1d'          
     2  adhiaow1=1eu091u9
     3  adahwod=109313
     4  line1 = 13131
     5  ks=1111
     6  iwah=1381903
     7  ewew=11381093
     8  dawd=1131
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2| sed '$d'
     1  dahodh=dadoianda
     2  adhiaow1=1eu091u9
     3  adahwod=109313
     4  line1 = 13131
     5  ks=1111
     6  iwah=1381903
     7  ewew=11381093

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2| sed '1!d'
     1  dahodh=dadoianda

q

退出,处理到某一行就退出


a c i

i 在之前插入

a 在之后插入

c 改变

sed '行号ixxxxxxxxx'

─(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2| sed '1i#/bin/bash' 
#/bin/bash
     1  dahodh=dadoianda
     2  adhiaow1=1eu091u9
     3  adahwod=109313
     4  line1 = 13131
     5  ks=1111
     6  iwah=1381903
     7  ewew=11381093
     8  dawd=1131
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2| sed '1a#/bin/bash'
     1  dahodh=dadoianda
#/bin/bash
     2  adhiaow1=1eu091u9
     3  adahwod=109313
     4  line1 = 13131
     5  ks=1111
     6  iwah=1381903
     7  ewew=11381093
     8  dawd=1131
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat -n 2| sed '1c#/bin/bash'
#/bin/bash
     2  adhiaow1=1eu091u9
     3  adahwod=109313
     4  line1 = 13131
     5  ks=1111
     6  iwah=1381903
     7  ewew=11381093
     8  dawd=1131

删除注释

//

/**/

, 表示区间匹配

空行是一行什么都没敲,包括(\n)

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat c1                                                
#include <stdio.h>

int main() {
    // 这是单行注释,用于解释代码的功能
    // 输出 "Hello, World!" 到标准输出
    printf("Hello, World!\n");

    /*
      这是多行注释,可以跨越多行。
      它通常用于详细说明代码的功能或提供额外的上下文。
     */
    return 0; // 返回 0 表示程序正常结束
} /* xxxxxxxxx */
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat c1 | sed 's/^\/\/.*$//g'
#include <stdio.h>

int main() {
    // 这是单行注释,用于解释代码的功能
    // 输出 "Hello, World!" 到标准输出
    printf("Hello, World!\n");

    /*
      这是多行注释,可以跨越多行。
      它通常用于详细说明代码的功能或提供额外的上下文。
     */
    return 0; // 返回 0 表示程序正常结束
} /* xxxxxxxxx */
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat c1 | sed 's/\/\/.*$//g' 
#include <stdio.h>

int main() {
    
    
    printf("Hello, World!\n");

    /*
      这是多行注释,可以跨越多行。
      它通常用于详细说明代码的功能或提供额外的上下文。
     */
    return 0; 
} /* xxxxxxxxx */
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat c1 | sed 's/\/\/.*$//g' | sed 's/\/\*.*\*\///g'
#include <stdio.h>

int main() {
    
    
    printf("Hello, World!\n");

    /*
      这是多行注释,可以跨越多行。
      它通常用于详细说明代码的功能或提供额外的上下文。
     */
    return 0; 
} 
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat c1 | sed 's/\/\/.*$//g' | sed 's/\/\*.*\*\///g' | sed '/\/\*/,/\*\//d'
#include <stdio.h>

int main() {
    
    
    printf("Hello, World!\n");

    return 0; 
} 

                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat c1 | sed 's/\/\/.*$//g' | sed 's/\/\*.*\*\///g' | sed '/\/\*/,/\*\//d' | sed -r '/^[ \t]+$/d' 
#include <stdio.h>

int main() {
    printf("Hello, World!\n");

    return 0; 
} 
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat c1 | sed 's/\/\/.*$//g' | sed 's/\/\*.*\*\///g' | sed '/\/\*/,/\*\//d' | sed -r '/^[ \t]+$/d' | grep -v '^$'
#include <stdio.h>
int main() {
    printf("Hello, World!\n");
    return 0; 
} 

引用外部变量

sed ' ' 单引号里面的变量不转义,直接将变量再加单引号即可。

" " 一般就可以解析变量

──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt    
ss 270947109 90 99
ll 920220920 90 90
dd 248727428 88 89
da 248972998 89 89
ds 284782947 89 89
ks 247824782 98 89
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt| sed 's/9/$a/g'
ss 270$a4710$a $a0 $a$a
ll $a20220$a20 $a0 $a0
dd 248727428 88 8$a
da 248$a72$a$a8 8$a 8$a
ds 284782$a47 8$a 8$a
ks 247824782 $a8 8$a
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# a=1       
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt| sed 's/9/$a/g'
ss 270$a4710$a $a0 $a$a
ll $a20220$a20 $a0 $a0
dd 248727428 88 8$a
da 248$a72$a$a8 8$a 8$a
ds 284782$a47 8$a 8$a
ks 247824782 $a8 8$a
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt| sed "s/9/$a/g"
ss 270147101 10 11
ll 120220120 10 10
dd 248727428 88 81
da 248172118 81 81
ds 284782147 81 81
ks 247824782 18 81
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt| sed 's/9/'$a'/g'
ss 270147101 10 11
ll 120220120 10 10
dd 248727428 88 81
da 248172118 81 81
ds 284782147 81 81
ks 247824782 18 81

$ 为最后一行

= 为行号

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt| sed -n '$='
6
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt| sed -n '=' 
1
2
3
4
5
6
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat a1.txt| sed  '$='  
ss 270947109 90 99
ll 920220920 90 90
dd 248727428 88 89
da 248972998 89 89
ds 284782947 89 89
6
ks 247824782 98 89

后向引用

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# ifconfig eth0 | sed '/inet .*net.*/!d'|sed 's/inet //g' | sed 's/net.*//g'
        192.168.54.129  

匹配ip:

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# ifconfig eth0 | sed -rn 's/^.*inet (.*) net.*$/\1/gp'
192.168.54.129 

后向引用,() 为要取的内容,后面加上 \1 \2 \3 ... 将括号里面的内容输出。

 ┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 11                                                       
dad111daw
989wewe1131
dwada11wdad
jdoad1313
waj223qdw
                                                                                                                                                           
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 11 | sed -nr 's/([a-z]{3})([0-9]{3})([a-z]{3})/\3\2\1/gp'
daw111dad
qdw223waj
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 11 | sed -r 's/([a-z]{3})([0-9]{3})([a-z]{3})/\3\2\1/g' 
daw111dad
989wewe1131
dwada11wdad
jdoad1313
qdw223waj

#\U 将后面所有的东西都大写。
#\u 首字母大写  
#\L 将后面所有的东西都小写。                                                                                                                     
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 11 | sed -r 's/([a-z]{3})([0-9]{3})([a-z]{3})/\3\U\2\1/g'
daw111DAD
989wewe1131
dwada11wdad
jdoad1313
qdw223WAJ

# & 取地址,将前面的拿到后面去。
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 11 | sed -r 's/([a-z]{3})([0-9]{3})([a-z]{3})/\3\U\2\1/g' | sed 's/.*/\U&/g'
DAW111DAD
989WEWE1131
DWADA11WDAD
JDOAD1313
QDW223WAJ

tr

替换 , 一个字符替换成一个字符。

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 11                                                                          
dad111daw
989wewe1131
dwada11wdad
jdoad1313
waj223qdw
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 11 | tr '0-9' ' '                                                           
dad   daw
   wewe    
dwada  wdad
jdoad    
waj   qdw
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 11 | tr 'a-z' 'A-Z'
DAD111DAW
989WEWE1131
DWADA11WDAD
JDOAD1313
WAJ223QDW

重复数据:

cat xxx | sort | uniq -c | sort -n

uniq -d 取重复行

uniq -c 统计并计数

...


& 表示匹配到了什么而已。

sed -r 's/./&\n/g'

例:

删除每行的第一个字符:

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 11                 
dad111daw
989wewe1131
dwada11wdad
jdoad1313
waj223qdw
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 11 | sed 's/^.//g'                                                          
ad111daw
89wewe1131
wada11wdad
doad1313
aj223qdw

删除每行的第二个字符:

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 11 | sed -r 's/^(.)./\1/g'
dd111daw
99wewe1131
dada11wdad
joad1313
wj223qdw

删除最后一个字符:

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 11 | sed 's/.$//g'        
dad111da
989wewe113
dwada11wda
jdoad131
waj223qd

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 11 | sed 's/.../& /g' > 12
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 12                        
dad 111 daw 
989 wew e11 31
dwa da1 1wd ad
jdo ad1 313 
waj 223 qdw 

删除开头为空的。

┌──(root㉿kali)-[/home/kali/Desktop/zz]
└─# cat 12 | sed '1,3s/^/#/g'                     
#dad 111 daw 
#989 wew e11 31
#dwa da1 1wd ad
jdo ad1 313 
waj 223 qdw

批量重命名

┌──(root㉿kali)-[/home/kali/Desktop/zz/tt]
└─# for i in `seq 10`;do touch $i.html;done
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz/tt]
└─# ls
1.html  10.html  2.html  3.html  4.html  5.html  6.html  7.html  8.html  9.html
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz/tt]
└─# vi c.sh
└─# cat c.sh                 
#!/bin/bash
for i in `ls *.html`
do
        cp $i `echo $i|sed 's/html/txt/g'`
done
                                                                                                                                              
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz/tt]
└─# bash c.sh 
                                                                                                                                                 
┌──(root㉿kali)-[/home/kali/Desktop/zz/tt]
└─# ls
1.html  10.html  2.html  3.html  4.html  5.html  6.html  7.html  8.html  9.html  c.sh
1.txt   10.txt   2.txt   3.txt   4.txt   5.txt   6.txt   7.txt   8.txt   9.txt

grep

grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrepfgrep。Windows系统下类似命令FINDSTR

GREP_百度百科

过滤之最.


用法

Linux grep 命令 | 菜鸟教程

grep命令详解 - 数据库小白(专注) - 博客园

Usage: grep [OPTION]... PATTERNS [FILE]...

在每个文件中搜索模式(PATTERNS)。模式可以包含多个用换行符分隔的模式。

示例:grep -i 'hello world' menu.h main.c

menu.hmain.c 文件中搜索包含"hello world"的行,忽略大小写。


模式选择与解释

  • -E, --extended-regexp:模式为扩展正则表达式。

  • -F, --fixed-strings:模式为固定字符串,不解释为正则表达式。

  • -G, --basic-regexp:模式为基本正则表达式(默认)。

  • -P, --perl-regexp:模式为 Perl 正则表达式。

  • -e, --regexp=PATTERNS:指定用于匹配的模式。

  • -f, --file=FILE:从文件中读取模式。

  • -i, --ignore-case:忽略模式和数据中的大小写差异。

  • --no-ignore-case:不忽略大小写(默认)。

  • -w, --word-regexp:仅匹配完整的单词。

  • -x, --line-regexp:仅匹配完整的行。

  • -z, --null-data:数据行以空字节结尾,而不是换行符。


其他选项

  • -s, --no-messages:抑制错误消息。

  • -v, --invert-match:选择不匹配的行。

  • -V, --version:显示版本信息并退出。

  • --help:显示帮助文本并退出。


输出控制

  • -m, --max-count=NUM:匹配到指定数量的行后停止。

  • -b, --byte-offset:输出匹配行的字节偏移量。

  • -n, --line-number:输出匹配行的行号。

  • --line-buffered:每行刷新输出。

  • -H, --with-filename:输出匹配行时显示文件名。

  • -h, --no-filename:不显示文件名前缀(默认)。

  • --label=LABEL:将 LABEL 用作标准输入的文件名前缀。

  • -o, --only-matching:仅显示匹配的部分。

  • -q, --quiet, --silent:抑制所有正常输出。

  • --binary-files=TYPE:假设二进制文件的类型为 TYPE,可选值为 binarytextwithout-match

  • -a, --text:等同于 --binary-files=text

  • -I:等同于 --binary-files=without-match

  • -d, --directories=ACTION:指定如何处理目录,ACTION 可为 readrecurseskip

  • -D, --devices=ACTION:指定如何处理设备、FIFO 和套接字,ACTION 可为 readskip

  • -r, --recursive:递归搜索目录。

  • -R, --dereference-recursive:递归搜索目录,并跟随所有符号链接。

  • --include=GLOB:仅搜索匹配 GLOB 的文件。

  • --exclude=GLOB:跳过匹配 GLOB 的文件。

  • --exclude-from=FILE:从文件中读取要跳过的文件模式。

  • --exclude-dir=GLOB:跳过匹配 GLOB 的目录。

  • -L, --files-without-match:仅列出没有匹配行的文件名。

  • -l, --files-with-matches:仅列出有匹配行的文件名。

  • -c, --count:仅输出每个文件中匹配行的数量。

  • -T, --initial-tab:根据需要调整制表符对齐。

  • -Z, --null:在文件名后打印空字节。


上下文控制

  • -B, --before-context=NUM:打印匹配行前的 NUM 行上下文。

  • -A, --after-context=NUM:打印匹配行后的 NUM 行上下文。

  • -C, --context=NUM:打印匹配行前后的 NUM 行上下文。

  • -NUM:等同于 --context=NUM

  • --group-separator=SEP:在带有上下文的匹配之间打印分隔符 SEP

  • --no-group-separator:不打印分隔符。

  • --color[=WHEN], --colour[=WHEN]:使用标记高亮显示匹配的字符串,WHEN 可为 alwaysneverauto

  • -U, --binary:不删除行尾的回车字符(适用于 MSDOS/Windows)。


其他说明

  • 如果文件名为 -,则从标准输入读取。

  • 如果未指定文件,则递归时读取当前目录(.),否则从标准输入读取。

  • 如果指定的文件少于两个,则默认使用 -h(不显示文件名前缀)。

  • 如果有匹配的行,退出状态为 0;否则为 1。

  • 如果发生错误且未指定 -q,退出状态为 2。


相关推荐
会飞的土拨鼠呀7 分钟前
Prometheus监控minio对象存储
运维·prometheus
hy____12331 分钟前
动态内存管理
linux·运维·算法
ks胤墨31 分钟前
Docker快速部署高效照片管理系统LibrePhotos搭建私有云相册
运维·docker·容器
小度爱学习1 小时前
数据链路层协议
运维·服务器·网络·网络协议·网络安全
龙之叶1 小时前
Android13源码下载和编译过程详解
android·linux·ubuntu
hhzz1 小时前
Ansible自动化运维实战--通过role远程部署nginx并配置(8/8)
运维·自动化·ansible
_Eden_1 小时前
Ansible介绍与入门学习
运维·学习·ansible
小猪佩奇TONY3 小时前
Linux 内核学习(4) --- devfreq 动态调频框架
linux·运维·学习
喝醉酒的小白3 小时前
K8s运维管理平台 - xkube体验:功能较多
运维
爱吃喵的鲤鱼4 小时前
Linux——网络(udp)
linux·网络·udp