【问题标题】:Unix/Linux Shell Grep to cutUnix/Linux Shell Grep 切
【发布时间】:2012-10-04 23:15:50
【问题描述】:

我有一个文件,说“名称”,看起来像这样

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”?

【问题讨论】:

  • 您正在使用什么 shell 来打印文件中的行?您发布的代码不应给出您显示的输出。
  • 运行$SHELL -x yourscript并查看分配给line的值;是一两行吗?

标签: linux shell unix grep cut


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    grep "willybd" /dir/names | cut "-d " -f1-3
    

    cut 的默认分隔符是制表符,而不是空格。

    【讨论】:

      【解决方案3】:

      除非你需要中间变量,否则你可以使用

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

      Linux 的一大优点是大多数命令都可以用作过滤器:它们从stdin 读取并写入stdout,这意味着您可以将一个命令的输出“管道”到下一个命令。这就是| 字符的作用。发音为 pipe

      【讨论】:

      • 有趣的是,我运行了您列出的命令,正如我所料,它没有打印原始行。你确定你没有$echo $line?否则,我不确定为什么我的单行版本的行为会与您的不同。
      猜你喜欢
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      相关资源
      最近更新 更多