文章目录
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。
使用实例
以冒号为分隔符,搜索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