您的位置:首页 > 运维架构 > Shell

shell中字符提取命令awk和cut的不同

2017-12-10 23:11 841 查看
shell编程中,用于字符提取或者截取的命令有3个,分别是cut,awk,sed,严格的说,sed不能说字符截取命令,他是字符替换命令,在这里,我们总结一下cut和awk的不同:

1命令的使用格式不同

cut

cut [选项] 文件名
·选项可以为:
-f 列号 : 提取第几列
-d 分隔符 :按照指定的分隔符将一行分割成数列,cut默认的分隔符是制表符


awk

awk '条件1{动作1}条件2{动作2}......条件n{动作n}' 文件名
条件:一般使用关系表达式作为条件,比如大于号 ">" ,小于号 "<"
动作:包括,格式化输出 和 流程控制语句


2默认的分隔符的不同:

cut默认的分隔符是制表符,而awk 默认的分隔符是空格 或者 制表符,当一个文件中,每一行都含有 空格 时,要使用awk ,否则会出现错误:
比如:df 这个文件
[root@localhost japan]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root   16G  6.9G  9.2G  43% /
devtmpfs             473M     0  473M   0% /dev
tmpfs                489M   80K  489M   1% /dev/shm
tmpfs                489M  7.1M  482M   2% /run
tmpfs                489M     0  489M   0% /sys/fs/cgroup
/dev/sda1           1014M  173M  842M  18% /boot
/dev/mapper/cl-home 1017M   59M  959M   6% /home
tmpfs                 98M   52K   98M   1% /run/user/0


它得每一列之间是使用 空格作为分隔符的,但是看第一列和第二列,空格不只有一个,如果想当然的使用cut 命令,以空格作为分隔符,输出第五列使用率,会出错

[root@localhost japan]# df -h | cut -d " " -f 5

59M


结果前六行和最后一行是空的,只有第七行的第五列输出来了

如果使用awk命令:

[root@localhost japan]# df -h | awk '{print $5}'
Use%
43%
0%
1%
2%
0%
18%
6%
1%


正确输出,课件,awk默认是以空格作为分隔符,当一个文件的列之间有多个空格并且数量不一定时,使用awk能够很好解决。

可是,cut 可以使用 -d 来指定分隔符,awk怎么指定呢?

使用BEGIN和FS

举个例子:

#看一下这个文件
cat /etc/passwd
[root@localhost japan]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus
Proxy:/:/sbin/nologin


可以看出,是以“:”作为分隔符的

[root@localhost japan]# cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"}{printf $1 "\t" $3 "\n"}'
root    0
amandabackup    33
shizengqiang    1000
user1   1002
[root@localhost japan]#


其中 单引号中的BEGIN{FS=”:”}就是指定 “:”为分隔符

其他的不同,等我发现了再补充。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell awk cut