请协助执行以下脚本,该脚本匹配变量并提供输出。该脚本正在与精确的匹配第 1 列和第 2 列,但当存在部分的匹配。
cat ~/bin/MYSH
#!/bin/bash
arg="${1:?}"
awk -v arg="${arg//\\/\\\\}" '$1 == arg || $2 == arg' "$@" inputfile
输入文件-
1111 1111RETAIL RETAIL8888Node
2222 2222RETAIL RETAIL7777Node
3333 3333AUDITTEST AUDIT6666Node
4444 4444AUDIT AUDIT3333Node
5555 5555SALE SALE4444Node
6666 6666SALE SALE2222Node
7777 7777FINANCE FINANCE1111Node
8888 8888FINANCE FINANCE5555Node
该脚本通过在第 1 列或第 2 列中输入精确匹配的单词进行搜索来提供输出,如下所示。
$ MYSH 6666
6666 6666SALE SALE2222Node
$ MYSH 4444AUDIT
4444 4444AUDIT AUDIT3333Node
当第 2 列中有 2-3 个或任何匹配字符时,我还需要此脚本来提供输出,如下所示。
预期产出-
$ MYSH 4444AU
4444 4444AUDIT AUDIT3333Node
或者
MYSH 7777FINAN
7777 7777FINANCE FINANCE1111Node
答案1
测试$1 == arg
是真的arg
如果第一个字段与变量的值相同。要测试 的值是否arg
可以在 中的某处找到$1
,您可以使用该index()
函数。此函数返回找到子字符串的位置,如果未找到则返回零:
#!/bin/sh
arg=${1:?} awk 'index($1,ENVIRON["arg"]) || index($2,ENVIRON["arg"])' inputfile
如果您希望子字符串仅在字段的开头匹配,请检查函数的返回值index()
是否为 1:
#!/bin/sh
arg=${1:?} awk 'index($1,ENVIRON["arg"])==1 || index($2,ENVIRON["arg"])==1' inputfile
我还将脚本的第一个参数作为环境变量传递到awk
命令中,允许我们使用它而无需将反斜杠更改为双斜杠。
一可以还可以使用$1 ~ ENVIRON["arg"]
(或$1 ~ "^" ENVIRON["arg"]
仅在开始时匹配),这将使用用户提供的值作为针对第一个字段的值的正则表达式来执行正则表达式匹配。然而,这是不合适的,除非用户知道他们正在提供一个正则表达式而不是一个字符串。