![grep/awk 未返回预期结果](https://linux22.com/image/217194/grep%2Fawk%20%E6%9C%AA%E8%BF%94%E5%9B%9E%E9%A2%84%E6%9C%9F%E7%BB%93%E6%9E%9C.png)
我编写了下面的脚本,将其命名为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:
$ awk '$1=="TEST"' file
TEST RETAIL RETAILTESTNode
TEST AUDIT AUDITTESTNode
和grep:
$ grep '^TEST ' file
TEST RETAIL RETAILTESTNode
TEST AUDIT AUDITTESTNode
和sed:
$ 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/bin
PATH
- 最好用更多描述脚本功能的名称来命名它
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
第一个参数已经被使用