Linux基础—正则表达式

发布于:2024-11-28 ⋅ 阅读:(27) ⋅ 点赞:(0)

正则表达式的作用

用来匹配文本的内容,命令的输出也属于文本内容,亦可以使用正则表达式

通配符

用来匹配文件名和目录名

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 按文件大小拆分 (推荐)

  1. 按行数拆分文件

    默认情况下,split 命令会根据指定的行数拆分文件。例如,要将名为 largefile.txt 的文件拆分为每 1000 行的小文件,可以使用以下命令:

    split -l 1000 largefile.txt

    这将生成一系列文件,如 xaaxabxac 等,每个文件包含 1000 行。

  2. 按文件大小拆分文件

    使用 -b 选项,可以根据文件大小拆分文件。例如,要将名为 largefile.txt 的文件拆分为每个 1MB 的小文件,可以使用以下命令:

    split -b 1M largefile.txt

    这将生成一系列文件,如 xaaxabxac 等,每个文件的大小约为 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}"