Linux|Shell——文本处理命令


文章目录

  • Shell——文本处理命令
    • 1、cut
    • 2、awk

Shell——文本处理命令 1、cut cut 命令用于显示每行从开头算起 num1 到 num2 的字符,字节和字段,并将这些字符,字节和字段输出。
语法格式
cut [参数] 文件名

参数:
  • -c :以字符为单位进行分割,后面加n表示取第几列,如-c 3。
  • -d :自定义分隔符,默认分隔符为制表符“\t”
  • -f :指定提取第几列。
使用实例
以空格为分隔符,截取并输出文本cut.txt的第一列字符:
[root@haoming home]# cat cut.txt jin mao jing xian ling xia long cai chi neng lan chi fen ji [root@haoming home]# cut -d " " -f 1 cut.txt jin jing ling long chi lan fen

结合管道符的使用:搜索passwd文件,以冒号为分隔符,截取第1,6,7列
[root@haoming home]# cat /etc/passwd |grep bash$ root:x:0:0:root:/root:/bin/bash mysql:x:997:1001::/home/mysql:/bin/bash es:x:1001:1002::/home/es:/bin/bash [root@haoming home]# cat /etc/passwd | grep bash$| cut -d ":" -f 1,6,7 root:/root:/bin/bash mysql:/home/mysql:/bin/bash es:/home/es:/bin/bash

结合管道符的使用:以冒号为分隔符,截取第三个冒号前面的所有列:
  • cut -d ":" -f -3:截取第三个冒号前面的所有列
  • cut -d ":" -f 3-:截取第三列往后所有列
[root@haoming home]# cat /etc/passwd | grep bash$| cut -d ":" -f -3 root:x:0 mysql:x:997 es:x:1001

2、awk awk 命令是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。
语法格式
awk [参数] '脚本命令' 文件名

参数:
  • -F fs : 指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符。
  • -f file : 从脚本文件中读取 awk 脚本指令,以取代直接在命令行中输入指令。
  • -v var=val : 在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val。
使用实例
【Linux|Shell——文本处理命令】以冒号为分隔符,搜索passwd文件中以root开头的所有行,并输出行的第一列和七列,并以逗号分割:
[root@haoming home]# cat /etc/passwd | awk -F ":" '/^root/{print $1","$7}' root,/bin/bash

  • $0 代表整个文本行
  • $n 代表文本行中的第 n 个数据字段
BEGIN 和 AND关键字
BEGIN 会强制 awk 在读取数据前执行该关键字后指定的脚本命令
END 会在awk读完数据后执行该关键字后指定的脚本命令
awk 'BEGIN {print "USERNAME"} awk 'BEGIN {print "PASSWORD"}

-v 自定义变量的使用
把所有的用户id加上指定的数 i:
-v i=1:定义变量i,初始值为1,这样脚本命令中的变量 i 就不用修改,在外面修改 i 的值即可
#查询所有的用户id [root@haoming home]# cat /etc/passwd | awk -v i=1 -F ":" '{print $3}' 0 1 2 3 4 5 6 7 997 1001 996 #所有的用户id+1 [root@haoming home]# cat /etc/passwd | awk -v i=1 -F ":" '{print $3+i}' 1 2 3 4 5 6 7 8 998 1002 997 #所有的用户id+5 [root@haoming home]# cat /etc/passwd | awk -v i=5 -F ":" '{print $3+i}' 5 6 7 8 9 10 11 12 1002 1006 1001

    推荐阅读