【问题标题】:Need to remove the path from the output of a grep but not the file需要从 grep 的输出中删除路径,而不是文件
【发布时间】:2013-06-24 04:49:46
【问题描述】:

我有一个运行良好的脚本,但在该脚本中我使用 grep 提取两行

grep -e "string1" -e "string" my_fliles* >> //destination

输出看起来不错

filename1 string1
filename1 string2
filename2 string1
filename2 string2
filename3 string1
filename3 string2

这是想要的效果,但为了让它在 cron 作业中工作,我必须指定 my_files 的完整路径

grep -e "string1" -e "string" /home/username/scriptfolder/logs/my_fliles* >> //destination

这会产生像

这样的输出
/home/username/scriptfolder/logs/filename1 string1
/home/username/scriptfolder/logs/filename1 string2
/home/username/scriptfolder/logs/filename2 string1
/home/username/scriptfolder/logs/filename2 string2
/home/username/scriptfolder/logs/filename3 string1
/home/username/scriptfolder/logs/filename3 string2

我想要文件名和字符串输出,而不是路径。 我尝试删除路径并在脚本中指定路径

export PATH=$PATH:/home/username/scriptfolder/logs/

但这没有用。 有什么建议吗?

【问题讨论】:

    标签: shell cron grep output


    【解决方案1】:
    grep -e "string1" -e "string" ./my_fliles* | 
    awk -F " " '{ n = split($1,RES,"/"); OUT=RES[n];
    for( i=2; i<=NF; i++) { OUT=OUT" "$i } print OUT;}'
    

    grep 结果中,路径和字符串由' '(空格)分隔

    /home/username/scriptfolder/logs/filename1 string1
    

    您可以使用-F 标志来设置awk 使用的字段分隔符,默认分隔符是空格。 这会将输入拆分为 $1, $2, . . . , $NF 字段。

    awk 有一个预定义函数split

    n = split( String, A, [Ere] )
    

    该函数将String参数指定的字符串拆分成数组元素A[1], A[2], . . ., A[n],并返回值 n 变量。使用Ere 参数指定的扩展正则表达式或使用 如果未给出 Ere 参数,则为当前字段分隔符(FS 特殊变量)。 A 数组中的元素是 使用字符串值创建,除非上下文指示特定元素也应具有数值。

    for( i=2; i&lt;=NF; i++) { OUT=OUT" "$i } 会将原始输入字段连接到由空格分隔的变量 OUT 中。这是为了确保我们不会因为搜索字符串 string1string2 中的空格而遗漏任何字段。注意循环以i=2开始

    最终输出如下所示:

    filename1 string1
    filename1 string2
    filename2 string1
    

    【讨论】:

    • 感谢有效的解决方案以及解释!
    【解决方案2】:

    PATH 是查找可执行文件的搜索路径,而不是常规文件,因此它不起作用。在你的 crontab 命令中试试这个:

    cd /home/username/scriptfolder/logs; grep -e "string1" -e "string" my_fliles* >> //destination
    

    【讨论】:

      【解决方案3】:

      如果您在目录外执行grep,我不确定是否有办法抑制路径。但是,您可以使用 awk 去除路径。比如:

      awk -F/ '{print $NF}' <(grep -e "string1" -e "string" /home/username/scriptfolder/logs/my_fliles*) > destination
      

      【讨论】:

        【解决方案4】:

        如果您手动使用grep -e "string1" -e "string" ./my_fliles* &gt;&gt; //destination,那么 用这两行编写一个脚本并运行该脚本

        cd /home/username/scriptfolder/logs/
        grep -e "string1" -e "string" ./my_fliles* >> //destination
        

        如果grep -e "string1" -e "string" ./my_fliles* &gt;&gt; //destination 是脚本的一部分,则添加

        cd /home/username/scriptfolder/logs/

        之前的这一行

        grep -e "string1" -e "string" ./my_fliles* &gt;&gt; //destination

        【讨论】:

        • 最佳:使用 pushd、popd 而不是 cd
        猜你喜欢
        • 2021-01-09
        • 1970-01-01
        • 2021-06-12
        • 1970-01-01
        • 2020-06-17
        • 2021-09-08
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        相关资源
        最近更新 更多