grep/awk 未返回预期结果

grep/awk 未返回预期结果

我编写了下面的脚本,将其命名为find,并将其保存在 中bin,但它没有给出预期的结果。当我执行时find TEST,它会匹配所有行中所有出现的TEST并提供输出。但我希望我的脚本TEST仅在第一列中查找。我正在使用,grep但我认为可以使用它来实现,awk但我无法使用它来实现awk

输入文件:

DEV       RETAIL       RETAILDEVNode  
TEST      RETAIL       RETAILTESTNode 
TEST       AUDIT       AUDITTESTNode
QA         AUDIT       AUDITQANode
PROD       SALE        SALEPRODNode
QA         SALE        SALETESTNode
QA        FINANCE      FINANCEQANode
PROD      FINANCE      FINANCEPRODNode
grep $1 inputfile`

输出:

TEST      RETAIL       RETAILTESTNode 
TEST       AUDIT       AUDITTESTNode
QA         SALE        SALETESTNode

预期输出:

TEST      RETAIL       RETAILTESTNode 
TEST       AUDIT       AUDITTESTNode

答案1

:

$ awk '$1=="TEST"' file
TEST      RETAIL       RETAILTESTNode 
TEST       AUDIT       AUDITTESTNode

:

$ grep '^TEST ' file
TEST      RETAIL       RETAILTESTNode 
TEST       AUDIT       AUDITTESTNode

:

$ sed -n '/^TEST /p' file
TEST      RETAIL       RETAILTESTNode 
TEST       AUDIT       AUDITTESTNode

:

$ perl -ane 'print if $F[0] eq "TEST"' file
TEST      RETAIL       RETAILTESTNode 
TEST       AUDIT       AUDITTESTNode

:

$ ruby -ane 'puts $_ if $F[0] == "TEST"' file
TEST      RETAIL       RETAILTESTNode 
TEST       AUDIT       AUDITTESTNode

与纯:

while IFS= read -r line; do
    [[ $line == TEST* ]] && echo "$line"
done < file
TEST      RETAIL       RETAILTESTNode 
TEST       AUDIT       AUDITTESTNode 

最后,使用脚本find_by_first_field

不要find用作脚本名称:

  • find如果变量~/bin之前存在,它将覆盖系统/usr/binPATH
  • 最好用更多描述脚本功能的名称来命名它

cat ~/bin/find_by_first_field

#!/bin/bash

exec awk -v arg=${1:?} '$1==arg' "${@:2}"

用法:

find_by_first_field <PATTERN> <file1> [file2 file3]

说明:

  • -v arg传递变量的方式是否可以在awk内部使用
  • $1默认情况下是第一个字段awk(空格和制表符分隔),不要与bash $1第一个参数混淆
  • arg是声明的awk变量
  • ${1:?}是第一个参数$1。使用bash参数扩展,如果缺少第一个参数,则会抛出错误
  • ${@:2} $@是参数列表。${@:2}是相同的,但是从秒元素开始,因为$1第一个参数已经被使用

相关内容