正则表达式的作用
用来匹配文本的内容,命令的输出也属于文本内容,亦可以使用正则表达式
通配符
用来匹配文件名和目录名
grep -m 次数 匹配几次后停止,只匹配相应行数
grep -v 取反,取反关键词的相应行数
grep -i 忽略字符的大小写,可以不加
grep -n 显示行号
grep -c 统计行数
grep -o 仅显示过滤的字符
grep -q 静默模式
grep -A 数字 after 包含匹配到的行,以及后几行
grep -A 3 root /etc/passwd
grep -B 数字 包含匹配到的行,以及前几行
grep -C 数字 包含匹配到的行,以及前后各几行
grep -w 匹配整个单词
-E 使用扩展正则表达式
egrep=grep -E
grep -f 匹配两个文件中的相同内容
grep -f 1.txt 2.txt(以第一个文件的内容为准)
grep -r 递归目录,查找文件内容,软链接的内容不包含
grep -R 递归目录,查找文件内容,包含软链接的内容
sort命令:对文本的内容进行排序,也可以根据不同的数据类型进行排序
数字在前,小写在后,大写在后,a AA b BB
sort -f 忽略大小写
sort -b 忽略每行前面的空格,空格不影响排序cat
sort -n 按照数字进行排序
sort -u 去重,相同的数据仅显示一行
sort -o 输出的文件名:把sort排序后的结果,输出到指定的文件
面试题:如何用sort方法将cat命令显示的/etc/passwd打印出来
cat -n /etc/passwd | sort -no xx.txt
uniq 去重,用于统计或者忽略文件中连续出现的重复行,一般和sort结合使用
uniq 选项 文件名
-c 统计连续重复的行的次数,并且合并重复的行
-d 仅显示重复出现的行 (必须是连续重复的行)
-u 显示仅出现一次的行(显示包括不连续的重复行)
root@test1-2:~# cat 1.sh
sss
sss
sss
iii
iii
pp
root@test1-2:~# cat 1.sh | uniq -c
3 sss
2 iii
1 pp
root@test1-2:~# cat 1.sh | uniq -u
pp
root@test1-2:~# cat 1.sh | uniq -d
sss
iii
tr 用来对标准输入的字符串进行替换、压缩和删除
tr 选项 参数
echo/cat ...| tr选项
-c 保留字符集1的字符,用其他字符来替换字符集2
-d 删除属于字符集1的字符
-s 将重复出现的字符串压缩成一个,用字符集2替换字符集1
-t 替换字符集 可以不加
echo 192.168.213.11 | tr '.' ""
echo 1234 | tr -c '123' 'a' = 123aa 保留字符集1,替换2double
echo 1234 | tr -d '123' = 4 删除123
echo 11112223334 | tr -s '1' = 12223334 压缩
压缩空格需要转义符 '\n'
cut 截取,对字段进行截取和裁剪
cut 选项 参数
cut 文件名 | cut 选项
-c 以字符的单位进行截取
-d 指定分隔符(默认分隔符为tab)
-f 指定要截取的字段
cut -d ':' -f 1-3(范围) 1,3(第一行和第三行) /etc/passwd
删除不要的列
换分隔符
面试题:文件合并的方法,区别
cat 1.txt 2.txt > 3.txt 特点是上下合并
paste 1.txt 2.txt > 4.txt 特点是左右合并
文件拆分:有一个日志文件,8G,直接打开速度很慢,有什么办法提高速度?
split -l 按行拆分
split -b 按文件大小拆分 (推荐)
-
按行数拆分文件
默认情况下,
split
命令会根据指定的行数拆分文件。例如,要将名为largefile.txt
的文件拆分为每 1000 行的小文件,可以使用以下命令:split -l 1000 largefile.txt
这将生成一系列文件,如
xaa
、xab
、xac
等,每个文件包含 1000 行。 -
按文件大小拆分文件
使用
-b
选项,可以根据文件大小拆分文件。例如,要将名为largefile.txt
的文件拆分为每个 1MB 的小文件,可以使用以下命令:split -b 1M largefile.txt
这将生成一系列文件,如
xaa
、xab
、xac
等,每个文件的大小约为 1MB。
大面试题
统计当前主机的连接状态
netstat -antp | grep -v "State" | tr -s ' ' | cut -d ' ' -f 6 | sort | uniq -c
正则表达式
*: 任意一个或多个字符
?:任意的单个字符
[a-z]
[A-Z]
[0-9]
基本正则表达式 grep
扩展正则表达式 grep -E =egrep
元字符:
.:表示任意单个字符
\:表示转义符
[a-z]
[A-Z]
[0-9] :表示匹配文件内容的任意单个数字
使用正则表达式匹配内容最好是用引号引起来
[[:blank:]] 空白字符,空格
():分组
[^] 取反
ls /opt/ | grep "[0-9a-zA-Z]"
表示次数:
*:任意字符,表示匹配前面的任意字符,0次,尽可能多的匹配
.*匹配任意长度的字符,最少要有一次,也就是匹配所有
\?:0或1
\+:>=1
\{n \}: 匹配前面的字符等于多少次
\{m,n \}:匹配前面的字符最少m次,最多n次
\{,n \}:最多n次,比n小都算
\{n, \}:匹配前面的字符最少n次
位置确定:
以什么开始 ^
以什么结尾 $
“^root$”只能是单个root,匹配整个单词且这一行只能有这一个单词
词首锚定
\b
词尾锚定
\b
面试题 ip地址
ifconfig ens33 |grep "inet" | grep "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"
分组和逻辑条件
分组:()
或:\ |
egrep扩展正则
可以不使用\
练习:
1、显示/etc/passwd中以sh结尾的行
root@test1-2:~# cat /etc/passwd | grep "sh$"
root:x:0:0:root:/root:/bin/bash
cwq:x:1000:1000:cwq,,,:/home/cwq:/bin/bash
lufei:x:1002:1002::/home/lufei:/bin/bash
suolong:x:1003:1003::/home/suolong:/bin/sh
2、查找/etc/inittab中含有“以s开头,并以d结尾的单词”模式的行
[root@localhost ~]# cat /etc/inittab | grep '\bs[a-z]*d\b'
# inittab is no longer used when using systemd.
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
3、查找ifconfig命令结果中的1-255之间的整数
root@test1-2:~# ifconfig | egrep "[1-9]{1}|[1-9]{1}[0-9]{1}|1[0-9]{2}|2[0-4]{1}[0-9]{1}|25[0-5]{1}"
4、在/etc/passwd中取出默认shell为bash的行
root@test1-2:~# cat /etc/passwd | grep "/bin/bash"
root:x:0:0:root:/root:/bin/bash
cwq:x:1000:1000:cwq,,,:/home/cwq:/bin/bash
lufei:x:1002:1002::/home/lufei:/bin/bash
5、 高亮显示passwd文件中冒号,及其两侧的字符
root@test1-2:~# cat /etc/passwd | egrep "[0-9a-zA-Z]{1}:[0-9a-zA-Z]{1}"