LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1716|回复: 7

awk '{printf "%-15s %s\n",$1,$3}' 问题求解

[复制链接]
发表于 2009-2-24 11:07:02 | 显示全部楼层 |阅读模式
[root@localhost test]# cat grade.txt
M.Tansley       05/99   48311   Green   8       40      44
J.Lulu  06/99   48317   green   9       24      26
P.Bunny 02/99   48      Yellow  12      35      28
J.Troll 07/99   4842    Brown-3 12      26      26
L.Tansley       05/99   4712    Brown-2 12      30      28

一下为原书的例子,运行后的结果如下
[root@localhost test]# awk '{printf "%-15s %s\n",$1,$3}' grade.txt              M.Tansley       48311
J.Lulu          48317
P.Bunny         48
J.Troll         4842
L.Tansley       4712
以下为我更改后的,运行结果如下
[root@localhost test]# awk '{printf "%-15s %s\n",$1,$2,$3,$4,$5,$6}' grade.txt
M.Tansley       05/99
J.Lulu          06/99
P.Bunny         02/99
J.Troll         07/99
L.Tansley       05/99

问题是:为什么我打印不出来$3,$4,$5,$6的值,而总是前面两个值?还有,“%-15s”这个15后面的s是什么意思,请教
 楼主| 发表于 2009-2-24 11:32:38 | 显示全部楼层
[root@localhost test]# awk '{printf "%-15s %-15s %s\n",$1,$2,$3}' grade.txt
M.Tansley       05/99           48311
J.Lulu          06/99           48317
P.Bunny         02/99           48
J.Troll         07/99           4842
L.Tansley       05/99           4712
刚才更改了一下命令,发现是printf修饰符的限定问题,第一个问题解决,但%-15s”这个15后面的s是什么意思捏?
回复 支持 反对

使用道具 举报

发表于 2009-2-24 13:35:12 | 显示全部楼层
我觉得你应该问什么是15呢?
学过C语言吗?C语言的printf函数里有对数据类型的定义,%d是整数,%c是字符,%f是浮点型,%s是字符串.......
拿着个做例子。%-15s,就是表示字符串占15个字符,不够的用空格补充,并且左对齐,如果%15s则是右对齐。
至于你“顶楼的第二个问题”,去看看C语言的printf()函数就明白了。
回复 支持 反对

使用道具 举报

发表于 2009-2-24 18:49:30 | 显示全部楼层
运行awk是不是需要自己安装什么软件包?

我在命令行下执行 arp -a | awk {print $4} 想要得到网卡的MAC地址,却没有看到预期的结果。
回复 支持 反对

使用道具 举报

发表于 2009-2-24 19:01:06 | 显示全部楼层
/sbin/arp -a | awk '{print $4}'  此命令在我的机子上是打印我的网关的mac地址。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-25 09:30:34 | 显示全部楼层
Post by elsove812;1951852
我觉得你应该问什么是15呢?
学过C语言吗?C语言的printf函数里有对数据类型的定义,%d是整数,%c是字符,%f是浮点型,%s是字符串.......
拿着个做例子。%-15s,就是表示字符串占15个字符,不够的用空格补充,并且左对齐,如果%15s则是右对齐。
至于你“顶楼的第二个问题”,去看看C语言的printf()函数就明白了。


谢谢您的答复,你的回复使我对printf有了更深的一些了解,我没有学过c,学shell时,也不知道printf函数是对数据类型的定义,我是按照书上说的,如下
awk printf修饰符
- 左对齐
Width 域的步长,用0表示0步长
. prec 最大字符串长度,或小数点右边的位数
表9-7 awk printf格式
% c ASCII字符
% d 整数
% e 浮点数,科学记数法
% f 浮点数,例如(1 2 3 . 4 4)
% g a w k决定使用哪种浮点数转换e或者f
% o 八进制数
% s 字符串
% x 十六进制数

现在为了工作才学习shell,c也许以后会看,目前真的没有精力,没有时间,没有机会,没有可能学习,先从shell开刀吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-25 09:38:22 | 显示全部楼层
Post by nothing9;1952014
运行awk是不是需要自己安装什么软件包?

我在命令行下执行 arp -a | awk {print $4} 想要得到网卡的MAC地址,却没有看到预期的结果。


[root@localhost ~]# arp -a | awk '{print $4}'
00:e0:4c:51:6d:40
00:22:64:4f:2e:43
00:73:07:3d:68:03
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-25 11:39:09 | 显示全部楼层
查看passwd中的用户的默认shell
cat /etc/passwd | awk 'FS=":" {printf "%-15s %s\n",$1,$7}'
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表