如何在shell脚本中将几个shell变量传递给awk?

时间:2013-07-26 13:27:48

标签: linux shell awk

我编写了一个shell脚本来获取任何列。 脚本是:

#!/bin/sh
awk '{print $c}' c=${1:-1}

所以我可以称之为

ls -l | column 2

但是我如何为多列实现它? 说,我想要类似的东西:

ls -l | column 2 3

3 个答案:

答案 0 :(得分:6)

在这种情况下,我根本不会使用awk:

columns() { tr -s '[:blank:]' ' ' | cut -d ' ' -f "$@"; }

这使用tr将所有空格序列压缩到一个空格,然后cut提取您感兴趣的字段。

ls -l | columns 1,5,9-

注意,您shouldn't parse the output of ls

答案 1 :(得分:3)

awk -v c="3,5" '
    BEGIN{ split(c,a,/[^[:digit:]]+/) }
    { for(i=1;i in a;i++) printf "%s%s", (i==1?"":OFS), $(a[i]); print "" }
'

使用您喜欢的任何非数字作为列号分隔符(例如逗号或空格)。

答案 2 :(得分:2)

ls -l | nawk -v r="3,5" 'BEGIN{split(r,a,",")}{for(i in a)printf $a[i]" ";print "\n"}'

现在您只需在shell脚本中更改r变量并将其传递给它。 或者您可以在shell脚本中配置它并使用r=$your_list_var

$your_list_var中存在的任何字段数字都将由awk命令打印。 上面的示例打印ls -l输出的第3和第5个字段。