grep

在 etc/passwd 中查找

  1. 找出 root 有关的行

    grep "root" /etc/passwd
  2. 找出 root 用户的行

    grep "^root" /etc/passwd
  3. 匹配以 root 开头或者以 ub 开头的行

    grep -E "^(root|ub)" /etc/passwd

    -E 选项:使用扩展正则表达式

  4. 匹配 root 用户和ubuntu用户的行

    grep -E "^(root|ubuntu)\>" /etc/passwd

    3 中会匹配 root1 root2 等开头的行,但是 4 不会。

  5. 过滤出 bin 开头的行并显示行号

    grep -n "^bin" /etc/passwd

    -n : 显示行号

  6. 过滤出除了 root 开头的行

    grep -v "^root" /etc/passwd

    -v : 反转匹配

  7. 统计 root 用户出现的次数

    grep -c '^root' /etc/passwd

    -c : 统计次数

  8. 匹配 ubuntu 用户,最多两次

    grep -m 2 '^root' /etc/passwd

    -m : 最多次数

  9. 匹配多文件列出存在信息的文件名字

    grep -l '^root' /etc/passwd pwd.txt null.txt

    -l : 显示匹配成功的文件名字

  10. 显示不以 /bin/bash 结尾的行

    grep -v "/bin/bash$" -n /etc/passwd
  11. 找出文件中的两位数或三位数

    grep -E "[0-9]{2,3}" /etc/passwd

    上述写法不能获得正确的匹配结果,它会在超过 3 位数的数字中匹配其中的两位和三位。这是不符合题意的。如图所示。

    image-20220504012821772

    正确的写法应该进行左右封闭。

    grep -E "\<[0-9]{2,3}\>" /etc/passwd

    image-20220504013029709

在以下文本文件中查找。

 I like my lover.
I love my lover.
He likes his lovers.
 He loves his lovers.
#she loves her cat
i want ride my bike

  
  1. 找出以至少一个空格字符开头,后面是非空字符的行。

    grep -E "^[[:space:]]+[^[:space:]]" test.txt

    第一个 ^ 表示行开头 第二个 [ ] 中的 ^ 表示取反

  2. 找出以 i 开头的行 忽略大小写

    grep -i "^i" test.txt
    grep -E "^[iI]" test.txt
    grep -E "^(i|I)" test.txt

    -i : 忽略大小写

  3. 找出系统中root、 ubuntu 的用户信息

    grep -E "^(root|ubuntu)\>" /etc/passwd
  4. 找出 /etc/init.d/functions 文件中的所有的函数名

    grep -E "^.+\(\)" /etc/init.d/functions
    grep -E "[a-zA-z]+\(\)" /etc/init.d/functions
    grep -E "[[:alnum:]]+\(\)" /etc/init.d/functions
  5. 找出用户名和 shell 相同的用户

    grep -E  "^([^:]+\>).*\1$" /etc/passwd

    思路:匹配非冒号的字符一次或多次,遇到冒号就右封闭,任意匹配中间结果,最后匹配 \1 ,\1 为前面小括号内的匹配结果,最后以 $ 结尾。

    image-20220504015931745

sed

首先在当前目录创建 pwd.txt

  1. 替换文件的 root 为 change ,只替换一次和替换所有

    # 替换一次
    sed 's/root/change/' pwd.txt   
    # 模式中加个 p 表示打印替换的行 -n 取消默认输出 (-n 一般和 p 配合)
    sed 's/root/change/p' pwd.txt -n
    # 全局替换
    sed 's/root/change/gp' pwd.txt -n
  2. 替换文件所有的 root 为 change,且仅仅打印替换的结果

    sed 's/root/change/gp' pwd.txt -n
  3. 替换前 10 行 b 开头的用户,改为 C,且仅仅打印替换的结果

    # 1,10 表示 1 到 10 行
    sed -n '1,10s/^b/C/p' pwd.txt
  4. 替换前 10 行 b 开头的用户,改为 C,且将 m 开头的行改为 M,且仅仅显示替换的结果

    # -e 编辑多次
    sed -n -e '1,10s/^b/C/p' -e 's/^m/M/p' pwd.txt 
  5. 删除 4 行后面的所有

    # d 删除 $ 结尾
    sed '5,$d' pwd.txt
  6. 删除 root 开始 到 ftp 之间的行

    # 双斜线中进行正则匹配
    sed '/^root/,/^ftp/d' pwd.txt 
  7. 将文件中空白字符开头的行,添加注释符#

    sed -e 's/^[[:space:]]/#/g' -e 's/^$/#/g' test.txt
  8. 删除文件的空白和注释行

    sed -e '/^#/d' -e '/^$/d' test.txt
    sed  '/^#/d;/^$/d'  test.txt
  9. 给文件的前三行添加@

    # -r 使用扩展正则
    sed -r '1,3s/(^.)/@\1/' test.txt
  10. sed 取出 IP 地址

    # 根据 ifconfig 的输出,先打印第二行,在将ip前面字符替换为空,再将ip 后面的字符替换为空
    ifconfig | sed '2p' -n | sed 's/^.*inet//' | sed 's/netmask.*//'
    ifconfig | sed '2s/^.*inet//;s/netmask.*//p' -n
    ifconfig | sed -e '2s/^.*inet//' -e 's/netmask.*//p' -n
  11. 找出系统的版本

    sed -r 's/^.*"(.*)"/\1/p' /etc/lsb-release -n 

-i 代表写入文件,不加-i都是修改内存中的数据

awk

  1. 在当前系统中打印出所有普通用的的用户名和家目录

    # -F 指定分隔符 NF 字段数量 $1 表示第一列 $0 表示一整行
    awk -F ":" '$3 >= 1000{print $1,$(NF-1)}' /etc/passwd
  2. 给 test.txt 前五行添加#

    # NR 行号 单引号中的双引号表示字符串
    awk 'NR<6{print "#"$0}' test.txt
  3. 取出所有电话号码

    # 文件内容: 姓名 地区 区号 电话号 捐款信息
    Mike Dalian:[1235] 365-5426:123:456:789
    
    Tom Dalian:[1235] 362-5426:123:456:789
    
    Jerry Dalian:[1236] 154-5426:123:456:789
    
    Moko Dalian:[1235] 999-5426:123:456:789
    
    # -F 指定空格和:为分隔符
    # ! 为取反 即非空行执行打印
    awk -F "[ :]" '!/^$/{print $4}' aaa.txt
  4. 显示出 Tom 的电话

    awk -F "[ :]" '/^Tom/{print $1,$4}' aaa.txt
  5. 找去地区为 D 开头的

    # ~ 为指定字段正则匹配
    awk -F "[ :]" '$2~/^D/{print $2}' aaa.txt
  6. 显示区号是 1235 的人名

    awk -F "[ :]" '$3~/\[1235\]/{print $1}' aaa.txt
  7. 显示Mike 的捐款信息,并在每一条前加上$

    awk -F "[ :]" '/^Mike/{print "$"$(NF-2),"$"$(NF-1),"$"$(NF)}' aaa.txt
  8. 显示所有人的 地区+,+名字

    awk -F "[ :]" '!/^$/{print $2","$1}' aaa.txt
    # 通过 -v 修改输出间隔符
    awk -F "[ :]" -v OFS="," '!/^$/{print $2,$1}' aaa.txt
  9. 删除文件的空白行

    awk '!/^$/' aaa.txt
    # awk 默认动作为 {print $0}
    awk '!/^$/{print $0}' aaa.txt