文本三剑客
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或者其他的模式是放在{}外面的
# 因此的话动作都是在{} 这个里面的

浙公网安备 33010602011771号