【问题标题】:Bash Shellscript Column Check Error HandlingBash Shellscript 列检查错误处理
【发布时间】:2019-02-22 22:30:29
【问题描述】:

我正在编写一个 Bash Shellscript。我需要检查一个文件是否 $value1 包含 $value2。 $value1 是列号(例如 1、4、5),$value2($value2 可以是 '03'、'04'、'09' 等)是我要查找的字符串。如果该列包含 $value2,则将文件移动到错误目录。我想知道最好的方法是什么。我在想 awk 还是有其他方法?

$value1 和 $value2 存储在配置文件中。我可以控制我可以使用的格式。这是一个例子。文件分隔符是八进制 \036。我刚刚用 | 描绘了下面。

例子

$value1=5
$value2=04

输入example1.txt

 example|42|udajha|llama|04
 example|22|udajha|llama|02 

输入example2.txt

example|22|udajha|llama|02 

结果 将 example1.txt 移动到 /home/user/error_directory 并且 example2.txt 留在当前目录中(没有任何反应)

【问题讨论】:

    标签: bash shell awk text-processing


    【解决方案1】:

    awk 可以报告出哪些文件满足这个条件:

    awk -F"|" -v columnToSearch=$value1 -v valueToFind=$value2 '$columnToSearch==valueToFind{print FILENAME}' example1.txt example2.txt
    

    那么你就可以在此基础上做你的mv了。

    使用管道到xargs 的示例(使用较小的变量名,因为您现在已经知道了):

    awk -F"|" -v c=$value1 -v v=$value2 '$c==v{print FILENAME}' example1.txt example2.txt | xargs -I{} mv -i {} /home/user/error_directory
    

    【讨论】:

    • 您的 xargs 解决方案完美运行。想知道您是否对如何在使用 xargs 时将有错误的文件记录到 error_log.txt 有任何想法?
    • 无需多加考虑,我认为您可以将管道连接到中间的tee,例如awk <blahblahblah> | tee -a error_log.txt | xargs <blah blah blah> tee 很酷,因为它将标准输入重定向到一个文件并且ALSO到标准输出,以便您可以在下游再次使用它。
    • 我看到这是一个非常好的解决方案。我有一个名为 log_error 的函数,它需要 4 个参数。我想使用 awk 中不正确的文件名作为第四个参数。我想知道您的解决方案是否可以做到这一点?
    【解决方案2】:

    如果您正在编写一个 bash shell 脚本,那么您可以使用 cut 将其按列分解。 真的有很多选择,这取决于你想要完成什么。

    根据我对数据的经验,我会使用冒号而不是管道,因为它可以让我避免使用“cut”命令进行转义。

    将数据文件更改为:

    cat example1.txt
    example:42:udajha:llama:04
    example:22:udajha:llama:02
    

    我会这样写:(添加 -x 以便您可以看到处理过程,但在您的代码中您不需要这样做。)

    [root@]# cat mysript.sh
        #!/bin/sh -x
    one=`cat example1.txt | cut -d: -f5`
    two=`cat example2.txt | cut -d: -f5`
    
    for i in $one
    do
    if [ $i -eq $two ]
         then
          movethis=`grep $two example1.txt`
          echo $movethis >> /home/me/error.txt
    fi
    done
    
    cat /home/me/error.txt
    [root@]# ./mysript.sh
    ++ cat example1.txt
    ++ cut -d: -f5
    + one='04
    02 '
    ++ cat example2.txt
    ++ cut -d: -f5
    + two=02
    + for i in '$one'
    + '[' 04 -eq 02 ']'
    + for i in '$one'
    + '[' 02 -eq 02 ']'
    ++ grep 02 example1.txt
    + movethis='example:22:udajha:llama:02 '
    + echo example:22:udajha:llama:02
    + cat /home/me/error.txt
    example:22:udajha:llama:02
    

    您可以使用您使用的任何命令来移动您的内容。 Touch,cp,mv,无论你想在那里使用什么。

    【讨论】:

    • 这包含所有最常见的 shell 错误:UUOC、不推荐使用的反引号、for 循环文件名和未引用的变量。
    • 您可以对任何字符使用 cut:cut -d'|' -f5 也可以。
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2022-06-13
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多