带有子目录的字符串的 grep (或其他)?

Posted

技术标签:

【中文标题】带有子目录的字符串的 grep (或其他)?【英文标题】:grep (or something else) for a string with a subdirectory? 【发布时间】:2021-12-28 23:28:55 【问题描述】:

我正在与杂乱无章的系统作斗争,该系统的大部分功能都使用大量 bash 脚本,我们发现了一个需要解决的错误。

我想我可以通过更改设置为 A 的变量 VAR1 来使其工作,具体取决于加载文件的位置,但为了做到这一点,我需要让系统知道何时确定进程打开了一个子目录中的文件,然后更改了变量,因为它只有两种加载这些文件的方法,从目录/var/system/folder/file.ext 或从子目录/var/system/folder/subfolder/file.ext

所以我的假设是,无论如何,只要做类似 ....

if [ ps -aux | grep /var/system/folder/*/*.*]; then
VAR1=B

例如,或类似的东西,这将使它在每次打开该子文件夹中的文件时显示带有命令行参数的路径名的输出,从而使其更改变量。但是......由于某种原因, grep 似乎不适用于通配符,我已经尝试了一段时间,但我无法弄清楚如何使其工作。非常感谢您的帮助。

【问题讨论】:

Grep 不使用通配符 - 它使用正则表达式。 grep 正则表达式中的星号表示前一个字符的零个或多个,前一个字符是斜杠,所以这不是您想要的。 ps -aux | grep "/var/system/folder/[^/]*/" 呢,它会查找 /var/system/folder/ 后跟一些以斜杠结尾的非斜杠字符。仅当存在子目录时才会匹配。您需要双引号,因为方括号对 bash 具有特殊含义。 您是否偶然使用了 Linux? @Shawn 是的,我使用的是 Linux。 @JerryJeremiah 几乎在那里,现在当我从 /var/system/folder/file.ext 加载文件时它显示 user 1438 0.0 0.0 10664 920 pts/0 S+ 12:05 0:00 grep --color=auto /var/system/folder/[^/]*/,这意味着 t 将不起作用,因为如果它有输出,它将改变变量 【参考方案1】:

我假设您想获取路径深度,而使用通配符的原因是因为事先不知道确切的名称(否则就使用它们)。

if
    LC_ALL=POSIX ps -fo args= aux |
    grep -E '[[:blank:]]/var/system/folder/[^/]+/[^/]+\.[^.]+$' >/dev/null 2>&1
then
    VAR1=B
fi

. 匹配任何字符,必须转义才能按字面意思使用。

您可以将[[:blank:]] 更改为cmd-name[[:blank:]]+ 或类似的(但允许使用命令行选项等)。 ^cmd-name.*/var/system..etc$ 将匹配命令行的开始和结束。有时可能会使用完整路径 /path/cmd./cmd 调用命令。

如果您使用的是 Linux,请查看 inofify-tools 软件包(inotifywait(1)inotifywatch(1))。当目录中的一个或多个文件发生访问或修改等事件时,您可以使用它们来触发命令。

【讨论】:

【参考方案2】:

终于搞定了! Jerry 所说的一个版本是有效的解决方案。

function checksubdir 
ps -aux | grep " /var/system/folder/[^/]*/" | grep process


if checksubdir;
then
VAR1=B

每当process/var/system/folder 中的子路径打开文件时,它都会产生一个输出,而第二个管道使它只显示这个过程,没有其他会混淆函数的输出。然后它正确地改变了变量。

【讨论】:

以上是关于带有子目录的字符串的 grep (或其他)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 N 行中 grep 多个字符串

如何 grep 字符串的目录,将其重写为其他内容并保存在 bash 中? [复制]

grep查找过滤指定目录或文件方法

grep 固定字符串不是 grepping 确切的字符串,带有额外字符 '-' 的字符串结尾也即将到来

如何grep和替换

如何grep和替换