在bash中使用awk命令从记录中提取单个字段

时间:2015-06-09 17:07:48

标签: linux bash

我想使用awk从记录列表中提取单个字段。例如,

Assignment1:/home/dir/:Admin:08-07-12
Assignment2:/home/dir/:Paul:09-22-13

我想从第二行提取第一个字段,或从第一行提取第三个字段。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

awk -F: 'NR == 2 { print $1 }'
awk -F: 'NR == 1 { print $3 }'

对于给定的行号,请打印指定的字段。

它不起作用

  

我很抱歉,我使用的是Bourne shell,但这不起作用。

如评论中所述,我不认为Bourne shell与问题有任何直接关系。 (如果将$IFS设置为奇怪的东西,或者某些其他特殊设置适用,可能会产生影响。但在正常的Bourne shell中,应该没有问题。)

这是我在我的机器上得到的东西(Ubuntu 14.04衍生产品,但我相信我会在Mac OS X 10.10.3上获得相同的结果,而且几乎任何其他类Unix系统也是如此)。这是使用Bash,但我不认为这是一个因素 - 我会说出Korn shell,Zsh,Dash和Heirloom Shell在这方面都会做同样的事情;哎呀,它应该在C shell shell系列中工作,因为所用的符号并没有什么特别之处)。它也使用GNU awk,但我认为这也不是一个因素。

$ cat data
Assignment1:/home/dir/:Admin:08-07-12
Assignment2:/home/dir/:Paul:09-22-13
$ awk -F: 'NR == 2 { print $1 }' data
Assignment2
$ awk -F: 'NR == 1 { print $3 }' data
Admin
$

输出看起来像记录2,字段1和记录1,字段3给我。请找到一种方法来证明你正在做什么以及你得到的结果 - 可能会在问题上添加一些内容。当我们弄清楚你的设置出了什么问题时,我们可以稍后清理它。请同样清楚地确定您的平台。

答案 1 :(得分:0)

您可以随时使用' cut'来自bash,如此

cut -d ":" -f "1,3" < asdf
Assignment1:Admin
Assignment2:Paul