文本三剑客的使用

三剑客是什么?

简介三剑客

指的是Linux系统中三个强大的文本处理工具:grepsed 和 awk。这三个工具因其强大的文本处理能力而被广泛使用

正则表达式

在熟悉三剑客之前先给大家讲讲什么是正则表达式

正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串中字符组合的模式。它是一种强大的文本处理工具,广泛应用于字符串搜索、替换、验证等场景。

正则表达式:字符过滤或者匹配、字符替换,编程语言

1.基本正则表达式

字符

作⽤

\

转义

^

匹配,以…为开头的

$

匹配,以…结束的

^$

空行

.

匹配任意⼀个字符

*

匹配前子表达式0次或者多次字符

.*

匹配任意字符

[list]

匹配list列表中的⼀个字符,例如:[abc]、[a-z]、[a-zA-Z0-9]

[^list]

取非

\{n\}

{n} 匹配前子表达式n次

\{n,\}

{n,} 匹配前子表达式至少n次

\{n,m\}

{n,m} 匹配前子表达式最少n次,最大m次

常见的转义字符

转义字符

含义

\a

响铃(BEL)

\b

退格(BS),将当前位置移到前一列

\n

换行(LF)将当前位置移到下一行开头

\r

回车(CR)将当前位置移动到本行开头

\t

水平制表(HT)调到下一个TAB位置

\v

垂直制表(VT)

\\

代表一个反斜杠字符“\”

2.扩展正则表达式

字符

作用

+

匹配前子表达式1次及以上

匹配前子表达式0次或1次

()

作为⼀个整体,通过\1,\2等分组匹配到的内容

|

以上两种是通常使用且常用的正则表达式。

三剑客

sed

搜索、查找和替换、插⼊或删除

工作流程

  1. 将行读取到模式空间

  2. 在模式空间执执行命令

  3. 打印模式空间的内容并清空模式空间

  4. 对下⼀行重复操作,直到文件结束

sed选项

-n   只打印
-r   正则
-i   修改原文件

sed使用

sed匹配格式:sed 选项 '/地址范围/编辑命令' 文件
sed -n '/$/p' a.txt       # $是特殊符号,匹配所有行末隐藏的$
sed -n '/\$/p' a.txt      # 匹配带$的行
sed -n '/^[a-z]/p' a.txt  # 匹配小写字母开头的行                       
sed -n '/go.d/p' a.txt    # 匹配go与d之间有任意⼀个字符
sed -n '/g*d/p' a.txt     # 前字表达式
sed -n '/g[la]ad/p' a.txt # 匹配g和ad之间有字符 l或a 的行
sed -n '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p' a.txt   # 匹配ip
p:打印
sed -n '5p' a.txt         # 输出第5行
sed -n '3p;5p' a.txt      # 输出第3行和第5行
sed -n 'p;n' a.txt        # 输出所有奇数行(n表示读取下⼀行)
sed -n 'n;p' a.txt        # 输出所有偶数行
sed -n '1,5{p;n}' a.txt   # 输出1~5行之间的奇数行
sed -n '$p' a.txt         # 输出最后
d: 删除
sed '5d' a.txt            # 删除第一行
sed '/^$/d' a.txt         # 删除空行
c:整行替换
sed '2 c AAAAAAAAAAAA' a.txt    # 将第2行整行替换为AAAAAAAAAAAA
sed '5,$ c AAAAAAAAAAA\nBBBBBBBBBBBB' a.txt 
r:把指定文件内容放发当前文件的第几行
sed '5r /etc/resolv.conf' a.txt
a:追加下一行
sed '2 a NNNN' a.txt             # 在第2行后添加 NNNN
i:追加上一行
sed '2 i NNNNNN' a.txt 
w:另存为 
sed '15,16w out.txt' a.txt       # 将15~16行另存为 out.txt 

s/old/new/g:替换
sed 's/o/O/g' a.txt       # 将所有的小o换成⼤O
sed '/^IP/ s/^/#/' a.txt  # 以IP开头的,行首加上#
过滤ip
ifconfig ens32 | sed -n '2 s/ n.*//p' | sed  's/.*t//'
ifconfig ens32 | sed -nr '2 s/.*t (.*) n.*/\1/p '
ifconfig ens32 | sed -nr '2 s/.*t (.*) n.*k (.*) b.*/\1 \2/p'    # 打印ip地址和子网掩码 
awk

内置变量

$0: 当前处理的行的整行内容
$n: 当前处理的第n个字段(第n列)
NF: 当前处理的行的字段个数(列数)
NR: 当前处理的行的序数(行数) 
OFS: 指定每行文本的字段分隔符,缺省为空格或制表位

选项

-F 指定分隔符 (默认空格)

awk使用

$0
awk '{print $0}' /etc/passwd     # 打印所有
NF
awk -F':' '{print $NF}' /etc/passwd          # 以冒号为分隔符,打印最后⼀列 
awk -F':' '{print $(NF-1)}' /etc/passwd      # 打印倒数第⼆列  
awk -F':' '{print NF "\t" $NF}' /etc/passwd  # 以冒号为分隔符,打印一共多少列tab打印最后⼀列
NR
awk '{print NR"、" $0}' /etc/passwd   # 打印行号
awk 'NR==3' /etc/passwd               # 打印第⼏行
awk 'NR>1' /etc/passwd                # 跳过第⼀行打印
awk 'NR % 2 == 0 {print $0}' a.txt    # 打印偶数行
awk 'NR==1,NR==3 {print $0}' demo.txt #  # 输出第1行 ~ 第3行的内容
awk 'NR==1;NR==3 {print $0}' demo.txt # 输出第1行和第3行的内容
过滤ip
ifconfig ens32 | awk 'NR==2 {print $2}'
OFS
awk 'BEGIN{"循环之前执行"} {awk表达式} END{"循环之后执行"}' 
vim demo.txt 
张三 男 22 北京 
李四 男 23 上海 
王五 女 18 ⼴州 
小红 女 19 桂林 
小安 女 20 杭州 
小达 男 26 深圳 
awk 'BEGIN{OFS="|"; print "序号","姓名","性别","年龄","地址"} {print $0} END{print "=================="}' demo.txt 
awk -F':' '{print $1,$3,$4}' demo.txt > users.csv
grep

主要用于搜索文件中的文本模式,可以配合正则表达式进行复杂的搜索。

grep 可以通过正则表达式来搜索文本,并打印出匹配的行。它不修改原始文件,只是显示匹配的内容。

选项
grep -i "word"  /root/1.txt     # 忽略大小写
grep -v "word"  /root/1.txt     # 反转
grep -w "word"  /root/1.txt     # 精准匹配
grep -o "word"  /root/1.txt     # 只输出匹配的字符,匹配到一次,输出一次
grep -n "word"  /root/1.txt     # 输出匹配字符所在的行号
grep -r "word"  /root/1.txt     # 在指定的路径下进行所有文件或目录的字符匹配查询
grep -A10 "word"  /root/1.txt   # 输出匹配字符后10行的信息
grep -B10 "word"  /root/1.txt   # 输出匹配字符前10行的信息
grep -C10 "word"  /root/1.txt   # 输出匹配字符前后各10行的信息
基础正则表达式
grep "[a-z]" 1.txt    # 范围匹配
grep "^[^0-9]" 1.txt  # 不匹配0-9开头的
grep "^word" 1.txt    # 过滤以字符开头的行
grep "word$" 1.txt    # 过滤以字符结尾的行
grep "^$" 1.txt       # 过滤空行
grep "l." 1.txt       # 过滤字符之后一个字符的行
grep "l..l" 1.txt     # 过滤字符之间带两个字符的行
过滤ip
ip a | grep -o "[0-9]\{3\}.[0-9]\{3\}.[0-9]\{3\}.[0-9]\{3\}" | sed -n "1p"
ip a | egrep -o "[0-9]{3}.[0-9]{3}.[0-9]{3}.[0-9]{3}" | sed -n "1p"
ifconfig | grep inet | sed -n 3p | awk '{print $2}'

以上就是所有内容下次见吧,拜拜~~~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值