2012-10-04 36 views
0

我有一个文件,说 '名',看起来像这样的Unix/Linux壳牌grep来削减

first middle last  userid 
Brian Duke Willy  willybd 
... 

每当我使用下面的

line=`grep "willybd" /dir/names` 
name=`echo $line | cut -f1-3 -d' '` 
echo $name 

它打印如下:

Brian Duke Willy  willybd 
Brian Duke Willy 

我的问题是,如果没有首先打印我剪下的原始线条,我会如何才能打印它“Brian Duke Willy”?

+1

你在使用使shell从要打印的文件中选择一行?你发布的代码不应该给你显示的输出。 –

+0

运行'$ SHELL -x yourscript'并查看分配给'line'的值;是一两行? –

回答

0

除非你所需要的中间变量,你可以使用

grep "willybd" /dir/names | cut -f1-3 -d' ' 

一个linux下的美丽的特点是,大多数命令可以用作过滤器:他们从stdin读写stdout,这意味着你可以将一个命令的输出“管道化”到下一个命令中。这就是|角色所做的。它的发音为管道

+0

*编辑*这工作,谢谢 – richard008

+0

搞笑,我跑你列出的命令,并如我所料,它没有打印原始线。你确定你没有'$ echo $ line'吗?否则,我不确定为什么我的单行版本的行为与您的行为不同。 –

1
​​

cut的默认分隔符是tab而不是空格。

3

通常的方法做这样的事情是:

awk '/willybd/{ print $1, $2, $3 }' /dir/names 

,或者更具体

awk '$4 ~ /willybd/ { print $1, $2, $3 }' /dir/names 

awk '$4 == "willybd" { print $1, $2, $3 }' /dir/names