【发布时间】:2018-04-02 14:20:00
【问题描述】:
sed 由于变量中的转义字符而提前终止。希望 awk 可以做我需要但看不到怎么做!
# Main section ==========================================╕
LASTIP=`grep -E '[0-2]{0,1}[0-9]{0,9}[0-9]{0,1}\.[0-2]{0,1}[0-9]{0,9}[0-9]{0,1}\.[0-2]{0,1}[0-9]{0,9}[0-9]{0,1}\.[0-2]{0,1}[0-9]{0,9}[0-9]{0,1}' $SRCDIR/$IPLOGFILE | tail -1|awk -F'\t' '{print$3}'`
if [ "$CURRENTIP" == "$LASTIP" ]; then
# Still using old IP===================================╕
FIRSTDETECTED=`grep $LASTIP $SRCDIR/$IPLOGFILE | tail -1|awk -F'\t' '{print$1}'`
LASTDETECTED=`grep $LASTIP $SRCDIR/$IPLOGFILE | tail -1|awk -F'\t' '{print$2}'`
OLDLINE=$(printf "$FORMAT" "$FIRSTDETECTED" "$LASTDETECTED" "$LASTIP")
AMENDEDLINE=$(printf "$FORMAT" "$FIRSTDETECTED" "$TIMESTAMP" "$LASTIP")
sed -i "s/'$OLDLINE'/'$AMENDEDLINE'/g" $SRCDIR/$IPLOGFILE
除了最后一个 sed 之外,这工作正常,因为 $OLDLINE 和/或 $AMENDEDLINE 包含转义字符而终止。我以为我可以直接替换 awk 来解决问题,但我越想越觉得整个部分可以用 awk 更有效地完成 - 也许在一行 awk 中?问题是我不知道从哪里开始。我是在自欺欺人地简化它还是有办法?如果有,你可能需要帮助我,因为我发现这些东西“扭曲了我脆弱的小心灵”*
*由卡特曼提供;P
我已经剪掉了该部分,但如果有帮助,我可以提供脚本的其余部分吗?
【问题讨论】:
-
作为一种解决方法,我尝试了以下两行而不是最后一行 sed
#sed -i "s/'$OLDLINE'/'$AMENDEDLINE'/g" $SRCDIR/$IPLOGFILEsed -i "$ d" $SRCDIR/$IPLOGFILEprintf "$FORMAT" "$FIRSTDETECTED" "$TIMESTAMP" "$LASTIP" >> $SRCDIR/$IPLOGFILE -
"删掉了部分,但可以提供其余部分" .. 请阅读Minimal,Complete,Verifiable Examples 我们希望看到产生问题的最小代码,而不是整个“战争与和平”大部头;- )。通常,当您将问题简化为基本问题时,您会自己找到解决方案。祝你好运。
-
我一般同意你的观点,但我问的是单个 awk 是否可以替代提供 LASTIP、IF 条件的 grep、提供 FIRSTDETECTED 和 LASTDETECTED 的 grep,最后是更新最新的 sed文件中的时间戳。如果不显示上下文,我看不到“重现”问题的方法。好的,所以我可以去掉我用来调试的几个 echos/printfs。我现在将其编辑出来;)
-
被查询的(制表符分隔的)文件包含第一次检测到 IP 的时间戳、最后一次检测到 IP 的时间和 IP 地址
-
无论您尝试做什么,在 awk 中都是微不足道的,但请编辑您的问题以提供简洁、可测试的样本输入和预期输出(即 minimal reproducible example 的缺失部分),所以我们可以帮助你。