2016-01-25 25 views
0

我使用awk命令从/ etc/passwd获取用户列表。现在我想给它编号,这是我使用的命令,但它似乎不起作用,我如何才能使它工作?编号awk命令的输出行

s=0 
awk -F':' '{s+=1} END {print "USER"$s" = " $1}' /etc/passwd 

我期待它输出:

USER1 = xyz 
USER2 = abc 

等等

+0

实际上并不是你想要的,只是一个想法:'cut -d:-f1/etc/passwd | nl' – user2683246

+1

'pr -n -l1 -t/etc/passwd'会给你行号输出(不带USER前缀)。 'nl'不会给空行编号,这对'/ etc/passwd'不应该是一个问题,但可能是其他上下文中的问题(并且可能是其他上下文中所需的)。 –

+0

@Jonathan Leffler:'nl -ba'会对所有行 – user2683246

回答

3

你之所以只得到一个结果行是您的打印只有一个单独的一行(最后),因为匹配您使用END关键字。

因为变量是由awk本身处理的,所以您不需要在shell中设置s=0。正如@JonathanLeffler提到的,$在awk中选择一个字段。因此$s将不会被变量s的值替换,而是由字段s替代,其中s是变量值。 (如果s == 2,你打印的场数2)

试试这个:

# Start with 0 (using an extra variable s) 
awk -F':' '{print "USER"s++" = " $1}' /etc/passwd 

# Start with 1 (using the internal variable NR) 
awk -F':' '{print "USER"NR" = " $1}' /etc/passwd 

# Produce sortable output for further processing 
awk -F':' '{printf "USER%04d=%s\n", NR-1, $1}' /etc/passwd 

多亏了评论者更多的想法。

+0

进行编号并得到可排序的'USER $ {N}'值,也许OP会使用'printf(“USER%04d =%s \ n”,++ s,$ 1)'(没有提到作为标准,但通常是后续;-))。 。祝你们好运。 – shellter

+0

@shellter它已经被排序:-) – steffen

+1

我会建议在这两种情况下,你使用'++ s'从1开始按照OP的意图,或者可能只是使用'NR'。 –