无法筛选包含“的行”;是一个目录";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将返回所有文件和目录
关于您可能想做什么的一些说明:
- 看起来
有一个-r表示“递归”选项。因此,您可能需要尝试:md5deep
而不是find命令md5deep -r *
- 如果您确实希望使用
命令,则可以使用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将返回所有文件和目录
关于您可能想做什么的一些说明:
- 看起来
有一个-r表示“递归”选项。因此,您可能需要尝试:md5deep
而不是find命令md5deep -r *
- 如果您确实希望使用
命令,则可以使用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'
具体回答澄清:如何使用