目录
一、grep命令
1.基本格式
grep [选项]… 查找条件 目标文件
2.常用命令
选项 | 功能 |
---|---|
-m [ x ] | 匹配x次 后停止,x为具体数字 |
-v | 取反 |
-i | 忽略字符大小写 |
-n | 显示匹配的 行号 |
-c | 统计匹配的行数 |
-o | 仅显示匹配到的字符串 |
-q | 静默模式,不输出任何信息 |
-A # after | 匹配内容的后#行 |
-B # before | 前#行 |
-C # context | 前后各#行 |
-e | 实现多个选项间的逻辑or关系 |
-w | 匹配 整个单词 |
-E | 使用扩展正则表达式,相当于egrep |
-F | 不支持正则表达式,相当于fgrep |
-r | 递归目录,但不处理软链接 |
-R | 递归目录,但处理软链接 |
-f file | file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件 |
-color=auto | 对匹配到的文本着色显示 |
#grep -m :匹配多少次后结束
grep -m 1 root /etc/passwd
root:x:0:0:root:/root:/bin/bash
# grep -E 拓展正则
grep -Ev '^[[:space:]]*#|^$' /etc/fstab
# ^:行的开始
# [[:space:]]*: 匹配任意数量的空白字符 * 表示前面的元素可以出现零次或多次。
# #: 紧接着空白字符之后,匹配注释符号
# ^$: 匹配完全空白的行
UUID=9f85ffd8-d116-4d93-b305-98254c7fb344 / xfs defaults 0 0
UUID=b5f61360-55f4-4f26-bbb7-3dbacfebc1f1 /boot xfs defaults 0 0
UUID=ed944890-6c21-44ac-8f62-22cfc3cda1a9 /home xfs defaults 0 0
UUID=8d6683ac-4d68-40b6-83b2-1ee1a2e0dc14 swap swap defaults 0 0
cat 123.txt |grep -v '^$' >test.txt #将非空行写入到test.txt文件
grep "^b" 123.txt #过滤已b开头
grep '/$' 123.txt #过滤已/结尾
3. sort 命令
以行为单位对文件内容进行排序,可以根据不同的数据类型来排序 【就是一个排序命令】
3.1 格式
sort 选项 参数
cat file | sort 选项
3.2 常用选项
选项 | 说明 |
---|---|
-f | 忽略大小写,默认会大写字母排在前面 |
-b | 忽略每行前面的空格 |
-n | 按照数字进行排序 |
-r | 反向排序 |
-u | 等同uniq,表示相同的数据仅显示一行,去重 |
-t | 指定字段分隔符,默认使用tab键分隔 |
-k | 指定排序字段 |
-o<输出文件> | 将排序后的结果转存至指定文件 |
sort -n test.txt #按数字大小进行排序
sort -n -r test.txt #按数字大小倒叙排列
sort -u test.txt #重复的数据只展示一次,相当于去重
4. uniq 快捷去重
uniq命令用于报告或者忽略文件中连续的重复行,常与sort命令结合使用。
4.1 格式
uniq [选项] 参数
cat 文件| uniq 选项
选项 | 说明 |
---|---|
-c | 统计连续重复的行的次数,并且合并重复的行 |
-u | 显示仅出现一次的行(包括不连续的重复行) |
-d | 仅显示重复出现的行(必须是连续的重复行) |
uniq -u test.txt #只显示出现一次的行
uniq -d test.txt #只显示连续重复的行
sort -n test.txt | uniq -c #对重复的数据行计数,并且去重输出
sort -n test.txt | uniq -u #只展示不重复的数据行
sort -n test.txt | uniq -d #只展示重复的数据行
5. tr 命令
常用于对来自标准输入的字符进行替换、压缩和删除
5.1 格式
tr 选项 参数
5.2 常用选项
选项 | 说明 |
---|---|
-c | 保留字符集1的字符,其他的字符(包括换行符\n)用字符集2替换 |
-d | 删除所有属于字符集1的字符 |
-s | 将重复出现的字符串压缩为一个字符串,用字符集2 替换 字符集1 |
-t | 字符集2 替换 字符集1,不加也行 |
echo 192.168.233.22 | tr '.' ' ' #把"." ,替换成空格
echo ABC | tr "A-Z" "a-z" #大写替换成小写
echo abc | tr -c 'ab' 'a' #保留了ab,替换了c,输出aa
echo abc | tr -d 'ab' #删除ab,打印c
练习:
1.使用grep和正则表达式,查找以“a”开头,以“z”结尾,且中间包含任意字符(包括0个字符)的行。
2.假设你有一个包含学生分数的文件,每行记录包含学生姓名和分数。请使用命令组合,找出分数最高的学生姓名和分数。
3.编写一个管道命令序列,首先使用grep查找包含特定模式的行,然后使用tr进行大小写转换,接着使用sort进行排序,最后使用uniq去除重复行。
二、sed 命令
1. sed基本概念
sed是行编辑器,sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等
sed最为核心的功能是增删改查
2. 基本操作格式
sed -e '操作' 文件1 文件2
sed -e '操作' 文件1 文件2
sed -f 脚本文件 文件1 文件2
sed -i -e '操作' 文件1 文件2
3. 常用选项
选项 | 说明 |
---|---|
-e | 表示用指定命令来处理输入的文本文件 |
-f | 表示用指定的脚本文件来处理输入的文本文件。 |
-i | 直接修改目标文本文件 慎用 |
-n | 仅显示script处理后的结果 |
s | 替换,替换指定字符 |
d | 删除,删除选定的行 |
a | 增加,在当前行下面插入一行指定内容 |
i | 插入,在选定行上面插入一行指定内容 |
c | 替换,将选定行替换为指定内容 |
y | 字符转换,转换前后的字符长度必须相同 |
p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容 如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。 |
= | 打印行号 |
l | 打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t) |
r | 扩展正则表达式 |
4. 应用
ifconfig ens33|sed -n 2p #打印第二行
inet 20.0.0.111 netmask 255.255.255.0 broadcast 20.0.0.255
# 打印时对行号的操作
sed -n '=' test1.txt #只显示行号
sed -n '=;p' test1.txt # 显示行号和每行的内容
sed命令的寻址打印:
方式一:按照行号寻求内容
sed -n '1p' test1.txt #打印第一行
sed -n '4p' test1.txt #打印第四行
sed -n '$p' test1.txt #打印最后一行
方式二:进行行号范围区间的打印
sed -n '1,3p' test1.txt #打印1-3行
sed -n '5,$p' test1.txt #打印第5行到最后一行
sed -n '2;+2p' test1.txt #打印第二行及后面第二行后面两行
sed -n '3p;5p' test1.txt #输出第三行和第五行
方式三:指定间隔打印
sed -n -e '2p'-e'$p' test.txt #打印第二行和最后一行
sed -n -e '2p'-e'3p' test.txt #打印第二行和第三行
方式四:对奇数行和偶数行的打印
sed -n 'n;p' test.txt #打印偶数行
sed -n 'p;n' test.txt #打印奇数行
n在p前面,跳过一行,打印下一行,就是偶数行;在后面,就是打印第一行,然后跳过一行,形成奇数行
5. 文本模式过滤行内容
方式一:对包含的字符串进行过滤打印
sed -n '/o/p' test.txt #包含o的所有行
sed -n '/th/p' test.txt #包含th的所有行
方式二:应用基础正则表达式进行打印
sed -n '/^root/p' /etc/passwd #以root为开头的所有内容,全文本搜索
sed -n '/bash$/p' /etc/passwd #以bash结尾的所有内容,全文本搜索
sed -n '4,/bash$/p' /etc/passwd #从第四行开始,一直打印到第一个以bash为结尾的所在行
方式三:使用扩展正则表达式进行打印
sed -r 支持扩展正则表达式。同时在 使用{n}、{n,}、{n,m}时,括号{}前不需要加反斜杠\ 。
sed -r -n '/(99:){2,}/p' /etc/passwd #包含有两个99:的内容所在行
sed -r -n '^root|bash$/p' /etc/passwd #包换以root开头,或者以bsah结尾的内容所在行
6. sed 的删除操作
sed -i 时会对文本进行实际操作(建议对目标文件先进行备份,再进行操作)。通过行号进行删除
sed 'd' test1.txt #删除所有,什么也不打印
sed -n '3d;p' test1.txt #删除第三行,打印剩余的所有内容
sed -n '5,8d;p' test1.txt #删除5到8行,打印剩余的所有内容
sed -n '5,$d;p' test1.txt #删除5到最后一行行,打印剩余的所有内容
sed '4,6!d' test1.txt #除了4-6行,其他的全部删除
如果要生效:sed -i -n
匹配字符串内容删除
sed '/one/d' test1.txt #删除包含one的行
sed '/one/,/six/d' test1.txt #删除one-six的行
sed '/one/,/six/!d' test1.txt #除了one-six的行,其余的全部删除,反向删除
sed '/six/!d' test1.txt #除了six的行,其余的全部删除,反向删除
字符串搭配正则进行删除:
sed '/^$/d' test1.tx #通过^$,来删除空行
删除空行的三种方法:
grep -v "^$" test1.txt ----过滤出非空行
cat test1.txt |tr -s "\n" ----压缩换行符
sed '/^$/d' test1.txt ----删除空行
7.sed 命令替换
7.1 格式
行范围 s/旧字符串/新字符串/替换标记
7.2 标记说明
替换标记 | 说明 |
---|---|
数字 | 表明新字符串将替换第几处匹配的地方 |
g | 表面新字符串将会替换所有匹配的地方 |
p | 打印与替换命令匹配的行,与-n一起使用 |
w文件 | 将替换的结果写入文件中 |
s | 替换字符串 |
c | 整行替换 |
y | 字符替换,替换前后的字符串长度必须相同 |
7.3 示例
sed -n 's/root/test/2p' /etc/passwd #指定第二个root,替换为了test
sed -n 's/root/test/gp' /etc/passwd #所有的root都替换为test
sed 's/[A-Z]/\l&/g' test1.txt #将大写全部转换为小写
l&是转换小写的一种特殊的符号,前面要加转义符“\”
sed 's/[a-z]/\u&/' test1.txt #把首字母替换成大写
u&是转换首字母大写的一种特殊的符号,前面要加转义符“\”
总结:
- sed命令是一种流编辑器读取文件会进行逐行读取加上指令操作,所以过大的文件一定要拆分后再交给sed处理
- sed -r 搭配扩展正则表达式使用,使用\{n\} \{n,\} \{n,m\} 不需要加“\”
- 用 -i 时一定要先备份(尤其对重要文件的操作),或者时先实验好确定无误时,再使用 -i
- sed 命令 的重点在于增删改查四个功能,可以运用在脚本中对重要文件配置的修改,添加等作用尤其有效
三、awk 命令
1.awk 命令基本概念
在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。
以空格做为分隔符,多个空格他会自动压缩成一个
2. 基本结构
awk '<pattern> <action>' <input-file>
操作符 怎么干 处理对象
#命令格式#
awk [选项] '[模式匹配条件]{处理动作 }' 文件1 文件2..
3.工作过程
- 执行BEGIN{action;… }语句块中的语句。
- 从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
- 当读至输入流末尾时,执行END{action;…}语句块
4.工作原理
- 读取输入:AWK首先读取输入文件或从标准输入接收输入;
- 分割输入:AWK默认将输入行分割成字段,并使用空格或制表符作为字段分隔符;
- 匹配模式:AWK使用模式匹配来确定需要处理的行,可以使用正则表达式或其他条件来指定匹配的行。如果没有指定模式,AWK将默认匹配所有行;
- 执行动作:当输入行与模式匹配时,AWK执行相应的动作;
- 处理下一行:一旦完成当前行的处理,AWK继续处理下一行,重复上述步骤。
5.常用选项
选项 | 说明 |
---|---|
-F | 指定分隔符,默认的分割符是若干个连续的空白符, |
-v | var=value 变量赋值 |
‘ ’ | 注意一定是单引号:'模式或条件 {操作}' |
{ } | { }外指定条件,{ }内指定操作。 |
6.内置变量
选项 | 说明 |
---|---|
$0 | 当前处理的行的整行内容 打印所有 |
$n | 当前处理行的第n个字段(第n列) |
NR | 当前处理的行的行号(序数) |
NF | 当前处理的行的字段个数。$NF代表最后一个字段 |
FS | 列分割符。指定每行文本的字段分隔符,输入内容的分隔符,默认为空格或制表位。与"-F"作用相同 用-F可以不加单引号 -F:,用FS必须用="" |
OFS | 输出内容的列分隔符 |
RS | 行分隔符 |
7. 示例
awk 'NR==3{print}' test1.txt #指定打印出第三行的内容
awk 'NR==3,NR==5{print}' test1.txt #打印3-5行的内容
awk 'NR==3;NR==5{print}' test1.txt #打印第三行和第五行
awk '(NR>=3)&&(NR<=5){print}' test1.txt #正则的表达方式,打印3-5行的内容
奇偶行打印:
awk 'NR%2==0{print}' test1.txt #打印偶数行
awk 'NR%2==1{print}' test1.txt #打印奇数行
awk运算:
awk 'BEGIN{print 100+200}'
300
awk 'BEGIN{print 10.2+20.3}'
30.5
awk 'BEGIN{print 10.2*20.3}'
207.06
awk 'BEGIN{print 10.2/20.3}'
0.502463