无法筛选包含“的行”;是一个目录";SED/AWK

无法筛选包含“的行”;是一个目录";SED/AWK,sed,awk,Sed,Awk,我运行的代码给出了以下示例数据 md5deep find * | awk '{ print $1 }' 输出样本 /Users/math/Documents/Articles/Number theory: Is a directory 258fe6853b1bfb2d07f512ff6bec52b1 /Users/math/Documents/Articles/Probability and statistics: Is a directory 4811bfb2

我运行的代码给出了以下示例数据

md5deep find * | awk '{ print $1 }'
输出样本

    /Users/math/Documents/Articles/Number theory: Is a directory
    258fe6853b1bfb2d07f512ff6bec52b1
    /Users/math/Documents/Articles/Probability and statistics: Is a directory
    4811bfb2ad04b9f4318049c01ebb52ef
    8aae4ac3694658cf90005dbdea37b4d5
    258fe6853b1bfb2d07f512ff6bec52b1
我试图通过SED筛选包含是目录的行,但未成功

md5deep find * | awk '{ print $1 }' | sed s/\/*//g
其样本输出为

/Users/math/Documents/Articles/Number theory: Is a directory
/Users/math/Documents/Articles/Topology: Is a directory
/Users/math/Documents/Articles/useful: Is a directory
如何通过SED/AWK筛选出包含“Is a directory”的每一行?

[澄清]
我想过滤掉包含目录的行。

为什么不使用grep呢

find . -type f

编辑:我刚刚重新阅读了你的问题,如果你想删除带有Is目录的行,请使用grep的-v标志,即:

md5deep find * | grep -v "Is a directory" | awk '{ print $1 }'

为什么不改用grep呢

编辑:我刚刚重新阅读了你的问题,如果你想删除带有Is目录的行,请使用grep的-v标志,即:

md5deep find * | grep -v "Is a directory" | awk '{ print $1 }'

我对md5deep不是很熟悉,但这可能会做一些您想要做的事情

find -type f -exec md5sum {} +

我对md5deep不是很熟悉,但这可能会做一些您想要做的事情

find -type f -exec md5sum {} +

我没有使用
md5deep
工具,但我相信这些行是错误消息;它们将代替标准输出,因此它们将直接进入终端,而不是通过管道。因此,它们不会被sed命令过滤。您可以通过合并标准错误和标准输出流来过滤它们,但是

看起来(我不确定,因为您缺少反报价)您正在尝试呼叫

md5deep `find *`
find将返回所有文件和目录

关于您可能想做什么的一些说明:

  • 看起来
    md5deep
    有一个-r表示“递归”选项。因此,您可能需要尝试:

    md5deep -r *
    
    而不是find命令

  • 如果您确实希望使用
    find
    命令,则可以使用
    -type f
    将其仅限于文件,而不是文件和目录。此外,您不需要将
    *
    传递到find命令中(如果有文件的名称与
    find
    所理解的选项相似,则可能会混淆
    find
    );传入
    将递归搜索当前目录

    find . -type f
    
  • sed
    中,如果您希望在模式中使用斜杠,那么使用\正确引用斜杠可能会很痛苦。您可以选择不同的字符来分隔正则表达式
    sed
    将使用
    s
    命令后的第一个字符作为分隔符。您的模式也缺少
    ;在正则表达式中,表示您使用的任何字符的一个实例
    ,并表示您使用的
    *
    “前面表达式的零个或多个”,因此
    *
    表示“任何字符的零个或多个”(这与glob模式不同,在glob模式中,
    *
    单独表示“任何字符的零个或多个”)

  • 如果确实希望在标准输出中包含标准错误流,使其通过管道,则可以运行:

    md5deep `find *` 2>&1 | awk ... 
    
  • 如果只想忽略stderr,可以将其重定向到
    /dev/null
    ,这是一个特殊文件,只会丢弃其中的任何内容:

    md5deep `find *` 2>/dev/null | awk ...
    
总之,我认为下面的命令将帮助您解决眼前的问题,如果我不了解您的需求,上面列出的其他建议可能会帮助您:

md5deep -r * | awk '{ print $1 }'

我没有使用
md5deep
工具,但我相信这些行是错误消息;它们将代替标准输出,因此它们将直接进入终端,而不是通过管道。因此,它们不会被sed命令过滤。您可以通过合并标准错误和标准输出流来过滤它们,但是

看起来(我不确定,因为您缺少反报价)您正在尝试呼叫

md5deep `find *`
find将返回所有文件和目录

关于您可能想做什么的一些说明:

  • 看起来
    md5deep
    有一个-r表示“递归”选项。因此,您可能需要尝试:

    md5deep -r *
    
    而不是find命令

  • 如果您确实希望使用
    find
    命令,则可以使用
    -type f
    将其仅限于文件,而不是文件和目录。此外,您不需要将
    *
    传递到find命令中(如果有文件的名称与
    find
    所理解的选项相似,则可能会混淆
    find
    );传入
    将递归搜索当前目录

    find . -type f
    
  • sed
    中,如果您希望在模式中使用斜杠,那么使用\正确引用斜杠可能会很痛苦。您可以选择不同的字符来分隔正则表达式
    sed
    将使用
    s
    命令后的第一个字符作为分隔符。您的模式也缺少
    ;在正则表达式中,表示您使用的任何字符的一个实例
    ,并表示您使用的
    *
    “前面表达式的零个或多个”,因此
    *
    表示“任何字符的零个或多个”(这与glob模式不同,在glob模式中,
    *
    单独表示“任何字符的零个或多个”)

  • 如果确实希望在标准输出中包含标准错误流,使其通过管道,则可以运行:

    md5deep `find *` 2>&1 | awk ... 
    
  • 如果只想忽略stderr,可以将其重定向到
    /dev/null
    ,这是一个特殊文件,只会丢弃其中的任何内容:

    md5deep `find *` 2>/dev/null | awk ...
    
总之,我认为下面的命令将帮助您解决眼前的问题,如果我不了解您的需求,上面列出的其他建议可能会帮助您:

md5deep -r * | awk '{ print $1 }'

具体回答澄清:如何使用awk和sed过滤掉行:

awk '/Is a directory/ {next} {print}'
sed 'g/Is a directory/d'

具体回答澄清:如何使用