"grep -v "^.$"" 的作用是什么

"grep -v "^.$"" 的作用是什么

我有一个用于清理数据文件的脚本

命令:

for i in `find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$" |grep data-`

我尝试在没有该功能的情况下运行该命令grep -v,但没有发现任何差异。

我想知道它的grep -v "^.$"作用是什么。我没有创建这个脚本,并且在网上找不到任何内容。

答案1

grep -v "^.$"将打印输入中的所有行,除了那些只有单个字符的行。

因为它用于:

find /ddomain/data/shop12/ -mtime +15 -print|grep -v "^.$"

我们可以假设它是从的输出中丢弃当前工作目录(.) (使用相对路径时显示),这可以通过选项轻松实现,尽管这里它是多余的,因为您在 中使用绝对路径。find.-mindepth 1find

稍后您只搜索data-名称中带有 的文件grep data-,这也是多余的。您可以将所有逻辑放在一次find调用中:

find /ddomain/data/shop12/ -name '*data-*' -mtime +15 -print

也删除-print,这是默认操作:

find /ddomain/data/shop12/ -name '*data-*' -mtime +15

请注意,如果您只查找文件,-type f也请添加:

find /ddomain/data/shop12/ -type f -name '*data-*' -mtime +15

答案2

正如其他人已经说过的,grep -v '^.$'过滤掉仅由一个字符组成的行(由行开头 ( ^) 后跟一个字符 ( .) 后跟行结尾 ( $) 组成的行。另一种编写方式是grep -vx .其中,-x使^$隐式(.整行匹配)。

关于输出:

find /ddomain/data/shop12/ -mtime +15 -print

这没有什么意义,因为该命令的输出find通常由以下行组成:

/ddomain/data/shop12/foo
/ddomain/data/shop12/foo/bar
...

该输出包含单个字符的行的唯一方法是如果存在名称类似于foo<newline>X<newline>.这是完全有可能的,但我想说这不太可能是该命令的意图。

该命令可能(错误地)改编自:

find . -mtime +15 -print | grep -v '^.$' | grep data-

grep目的是过滤掉.条目(即使这样,grep -Fvx .也会更合适)。然而,这样写会更有意义:

find . ! -name . -path '*data-*' -mtime +15

如果你想用 过滤掉顶级目录find /ddomain/data/shop12/,你可以这样做:

find /ddomain/data/shop12/. ! -name . -path '*data-*' -mtime +15

或者,如果您的find实现支持-mindepth谓词:

find /ddomain/data/shop12/ -mindepth 1 -path '*data-*' -mtime +15

答案3

.它从结果列表中删除该目录find。通过一个例子更容易解释:

find . -print
.
./prova2
./prova2/prova2  

find . -print | grep -v '^.$'
./prova2
./prova2/prova2  

正如您所看到的,在第一段代码中,我们找到了.结果。因此,您将其传递给循环所采取的操作for。在第二个代码片段中,您决定从 的结果中
跳过该目录,因此您不会将其发送到循环。.findfor

答案4

grep -v '^.$'排除只有一个字符的行。

例子:

echo "foo
> bar
> x" | grep -v '^.$'
foo
bar

相关内容