文本三剑客

grep命令

# 选项
-Ax 显示行数  # 显示匹配到的后几行

-Bx 显示行数  # 显示匹配到的前几行

-Cx 显示行数  # 显示匹配到前后几行

-i  # 忽略大小写

-q  # 静默输出

-n  # 显示行号

-o  # 只输出文件中匹配到的部分

-v  # 显示除了匹配之外的所有行

-c  # 输出匹配字符串中的行数

-r  # 递归的进行搜索,显示文件名和文件内容

-l  # 列出包含匹配字段的文件即可,不需要输出文本内容

-E # 使用正则表达式  与egrep命令一样



# 元字符

^  # 以什么开头的行,匹配 ^root 匹配以root开头的行

$  # 以什么结尾的行,root$ 匹配以root结尾的行

.  # 匹配一个任意的字符  gr.p  匹配gr后面的任意字符

字符*  # 匹配0个或者多个字符连接前面字符 r* 匹配0个r或者多个r字符  ,ro* 匹配 r字符和后面跟着0个r或者多个o字符 r,ro,roo

.* # 匹配任意字符   gr.* 匹配gr后面的任意字符或者0个字符

[abc] # 匹配abc中的任意一个字符

[^abc]  # 不匹配abc中的任意一个字符

[a-z]   # 匹配a-z里面的字符

\<  # 匹配以这个字开头的字,这个是一个单词字符,左边是一个非单词字符,右边是一个单词字符,

\>  # 匹配以这个字结尾的字  左边是单词字符,右边是非单词字符

\  # 取消后面单个字符的特殊含义


# 扩展正则

+ # 对前面一项匹配1次或者多次

? # 对前面一项匹配0次或者1次

{j}  # 对前面一项最多匹配j次

{,j}  # 对前面一项最多匹配j次

{j,}  # 对前面一项最少匹配j次

{j,k}  # 最少匹配j次,最多匹配k次

a|b  # 可以匹配a或者b

(exp) # 将这个exp作为一个整体来匹配

# 递归的搜索 显示文件内容包含root的文件名
[root@master ~]# grep -rl root /etc/passwd
/etc/passwd


# 显示不包含root的所有行
[root@master ~]# egrep  -v  root /etc/passwd

# 匹配root忽略大小写
[root@master ~]# grep -i root /etc/passwd


# 匹配root这个字开头的
[root@master ~]# grep  "\<root" passwd 
root:x:0:0:root:/root:/bin/bash

# 匹配root这个字结尾的
[root@master ~]# grep "ot\>" passwd 
root:x:0:0:root:/root:/bin/bash

# 匹配root这个字
[root@master ~]# grep  "\<root\>" passwd 
root:x:0:0:root:/root:/bin/bash

# 匹配r后面的所有字符,.是匹配r后面的任意字符,*就是匹配r后面的所有字符了
[root@master ~]# grep  "r.*" passwd 
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin

# 匹配ro字符和后面跟着0个o或者多个o
[root@master ~]# grep "roo*" passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin


# 多次匹配r或者0次r的也匹配到
[root@master ~]# grep r* passwd 
root:x:0:0:root:/root:/bin/bash

# 匹配ip地址

ifconfig |  egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}' | egrep -v '^255|255$'


grep命令总结

功能类别 命令示例 说明
基本搜索 grep "pattern" file 在文件中搜索包含 pattern 的行。
忽略大小写 grep -i "pattern" file 忽略大小写匹配。
显示行号 grep -n "pattern" file 显示匹配行的行号。
反向匹配 grep -v "pattern" file 显示不包含 pattern 的行。
整词匹配 grep -w "pattern" file 只匹配整个单词,避免子串匹配。
统计匹配次数 grep -c "pattern" file 统计匹配的行数。
递归搜索 grep -r "pattern" dir/ 递归搜索目录下的所有文件。
显示文件名 grep -l "pattern" file1 file2 只显示包含匹配内容的文件名。
高亮匹配 grep --color=auto "pattern" file 高亮显示匹配的字符串(多数系统默认已启用)。
多文件搜索 grep "pattern" *.txt 在多个 .txt 文件中搜索。
使用正则 `grep -E "pat1 pat2" file` 使用扩展正则表达式(等价于 egrep)。
排除文件 grep --exclude="*.log" "pattern" * 排除 .log 文件进行搜索。
只显示匹配部 grep -o "pattern" file 只输出匹配到的部分,而非整行。
前后行上下文 grep -A 3 "pattern" file 显示匹配行及后3行(-B 前N行,-C 前后各N行)。

sed命令

  • 主要就是对于这个文本文件进行修改

  • sed 选项

1、选项

-n # 不输出模式空间的所有内容,只输出对哪个有操作的内容

-e # 可以执行多个命令-e ' ' -e ' '

-r # 可以使用正则表达式,扩展正则表达式

-f  # 可以使用脚本

-i # 对原文件进行修改

# 地址定界(指定处理的行数)

num  # 数字,指定操作的行数

$   # 

/regexp/  # 通过匹配的关键字,可以结合正则使用,大写的I,忽略大小写

\%regexp%  # 匹配的关键字里面有特殊符号的话,使用这个,有多个的话,也使用这个

num1,num2  # 就是指定范围的行数,或者关键字也可以

first~step  # 1~2 从第一行开始,以2为步长来匹配

addr1,+N  # 匹配addr1行,以及后面的N行
addr2,-N  # 匹配addr1行到N行

# 常见的动作

a # 在匹配的行后添加

i # 在匹配的行前添加

d # 删除指定行

c(change) # 就是修改指定的行,一整行都需要修改

s(set) # 指定替换哪个关键字,所有替换的话,加上g

p  # 打印指定行

!  # 取反的动作

I  # 忽略大小写

w  # 另存为到另外一个文件

2、案例

# 打印第10行内容
[root@master ~]# sed -n '10p' passwd 
operator:x:11:0:operator:/root:/sbin/nologin

# 打印最后一行
[root@master ~]# sed -n '$p' passwd 
ootr:asadsa

# 匹配root这个关键字
[root@master ~]# sed -n '/root/p' passwd 
root:x:0:0:root:/root:/bin/bash

# 匹配有特殊符号的关键字
[root@master ~]# sed -n '\%/bin/bash%p' passwd 
root:x:0:0:root:/root:/bin/bash

# 打印1到5行的内容
[root@master ~]# sed -n '1,5p' passwd 

# 使用关键字来指定范围的行数(打印root到lp的行)
[root@master ~]# sed -nr '/^root/,/^lp/p' 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

# 指定步长,打印1行,然后以步长为2打印后面的行
[root@master ~]# sed -n '1~2p' passwd 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin

# addr1,+N行,打印1行,以及后面的5行
[root@master ~]# sed -n '1,+5p' passwd 
root:x:0:0:root:/root:/bin/bash


# addr1,-N行 打印1到5行的内容
[root@master ~]# sed -n '1,5p' 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

3、修改案例

1、添加内容

  • sed 选项 '匹配的行 动作 \添加的内容'
# 添加内容append,在第一行的后面添加内容
[root@master ~]# sed -i '1a\qqqq\' test 
[root@master ~]# cat test 
root
qqqq
binbash
su

# 通过匹配到的关键字后面添加内容
[root@master ~]# sed -i '/qqqq/a\mmm\' test 
[root@master ~]# cat test 
root
qqqq
mmm
binbash
su

# 在行前添加
[root@master ~]# sed -i '1i\aaa\' test 
[root@master ~]# cat test 
aaa
root
qqqq
mmm
binbash
su

2、修改

# 除了第一行外,匹配到了root这个关键字,所有都换成lll
[root@master ~]# sed -i '1!s/root/lll/g' test 
[root@master ~]# cat test 
aaa
lll
qqqq
mmm
binbash
su

# 将1行到3行另存为一个文件
[root@master ~]# sed -i '1,3w/root/qq.txt' test
[root@master ~]# cat qq.txt 
aaa
lll
qqqq

# 对一整行进行修改
[root@master ~]# sed -i '/aaa/c\uuuu\' test 
[root@master ~]# cat test 
uuuu
lll
qqqq
mmm
binbash
su

4、sed总结

  • 通过匹配关键字或者自己指定行数来匹配
类别 示例命令 说明
字符串替换 sed 's/old/new/g' file.txt 将文件中所有 old 替换为 new
字符串替换 sed 's/old/new/3' file.txt 替换每行中第3个 old
字符串替换 sed '3,5s/old/new/g' file.txt 仅替换第3到5行中的 old
字符串替换 sed '/pattern/s/old/new/g' file.txt 仅在包含 pattern 的行上替换 old
删除操作 sed '3d' file.txt 删除第3行
删除操作 sed '3,5d' file.txt 删除第3到5行
删除操作 sed '/pattern/d' file.txt 删除所有包含 pattern 的行
删除操作 sed '/^$/d' file.txt 删除所有空行 (以行首紧接行尾的行)
打印输出 sed -n '3p' file.txt 仅打印第3行 (-n 抑制默认输出,p 打印)
打印输出 sed -n '3,5p' file.txt 打印第3到5行
打印输出 sed -n '/pattern/p' file.txt 打印所有包含 pattern 的行 (类似 grep)
插入与添加 sed '3a\new text' file.txt 在第3行后添加 "new text"
插入与添加 sed '3i\new text' file.txt 在第3行前插入 "new text"
插入与添加 sed '/pattern/a\new text' file.txt 在匹配 pattern 的行后添加 "new text"
行处理 sed -n '1,5{p;n}' file.txt 打印奇数行 (1,3,5)
行处理 sed -n '2,6{n;p}' file.txt 打印偶数行 (2,4,6)

awk命令

  • 也是匹配对应的规则的,可以单独匹配某个需求的东西

  • 工作流程

    • 读取一行

    • 字段分割,将这个一行分割成多个字段,默认以空格作为分隔符,分割后,这些字段分为$1,$2,整行用$0表示

    • 模式匹配,检查该行是否匹配提供的模式

    • 执行动作,如果匹配成功,则执行对应的动作,{} 打印

awk '模式 {动作}' 输入文件

# 模式,可以是正则表达式,条件表达式,NR>10,

# 模式有 NF,NR,F 这些模式

# 动作,{}括起来的命令,通常是print语句,打印




$0 # 表示当前行的全部内容

$1,$2, # 当前行的1,2个字段

NF  # 当前行的字段总数  NF==6 表示只处理6个字段的行

NR  # 当前处理的行号,显示行号,表示处理哪一个行  NR==2

案例

[root@master ~]# cat demo.txt 
Alice 90 95
Bob 85 80
Charlie 78 92
Dave 95 98

# 打印第一列和第三列
[root@master ~]# awk '{print $1 $3}' demo.txt 
Alice95
Bob80
Charlie92
Dave98


# 打印行号和内容
[root@master ~]# awk '{print NR ":" $0}' demo.txt 
1:Alice 90 95
2:Bob 85 80
3:Charlie 78 92
4:Dave 95 98

# 打印最后一列
[root@master ~]# awk '{print $NF}' demo.txt 
95
80
92
98

# 正则表达式匹配:匹配包含 “li” 的行

[root@master ~]# awk '/li/ {print $0}' demo.txt 
Alice 90 95
Charlie 78 92


# 字段值比较,打印第二列大于90的行
[root@master ~]# awk '$2>90 {print $1 "的成绩是:"$2 }' demo.txt 
Dave的成绩是:95

# 使用-F选项修改分隔符,按照:冒号分割

[root@master ~]# awk -F ':' '{print $1 "---" $7}' /etc/passwd
root---/bin/bash

# 只需要处理第二行,取出第一个字段
[root@master ~]# awk 'NR==2 {print $1}' demo.txt 
Bob


[root@master ~]# cat data.txt 
Name Age City Occupation Salary Department
Alice 28 NYC Engineer 85000 Tech
Bob 32 SF Manager 95000
Charlie 24 Boston Analyst 65000 Finance HR

# 只处理字段有5个的行,并且打印第五个字段
[root@master ~]# awk 'NF==5 {print $5}' data.txt 
95000

awk总结

awk 'NF==5 {print $5}' data.txt 
# NF或者其他的模式是放在{}外面的

# 因此的话动作都是在{} 这个里面的
posted @ 2025-09-13 20:05  乔的港口  阅读(10)  评论(0)    收藏  举报