请问有人知道为什么这个命令没有给我任何输出吗?所有变量都是正确的,但没有结果。
寻找 。 -name "$cdr_type*$DAYZ*.unl*" | xargs zcat | xargs awk -F“|” '{如果(14 美元==$t日期 &&22 美元==$misdn) 打印 $0}'| 头
当我像这样回显命令时
echo "find . -name $cdr_type*$DAYZ*.unl* | xargs zcat | awk -F | '{if($14==$tdate && $22==$misdn) print $0}'|head"
这是我的输出:
寻找 。 -名称 mgr*20160928*.unl* | xargs zcat | xargs awk-F| '{如果(4==20160928093911 &&2==2348094398953)}'| 头
我的观察是它显示 4 美元和 2 美元,而不是 14 美元和 22 美元
答案1
$14
当由大多数类似 Bourne 的 shell 中的 shell 展开时,与 相同${1}4
,并且如果$1
为空或未设置,则按4
预期给出。在这里,您想要传递一个文字$14
,awk
以便awk
将其视为第 14 个字段。
通常在单引号内,该$1
变量不会扩展,但您没有告诉我们如何回声那个命令。
无论如何,在这里,它看起来像你想要的:
find . -name "$cdr_type*$DAYZ*.unl*" -exec zcat {} + |
awk -F "|" -v tdate="$tdate" -v misdn="$misdn" '
$14 == tdate && $22 == misdn' |
head
即将$tdate
和$misdn
shell 变量的内容作为awk
变量传递。