进程‘find’输出解析出某些字段

use*_*029 1 sed awk text-processing text-formatting

我发现输出如下:

/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";
Run Code Online (Sandbox Code Playgroud)

在此示例中,“user”和“Password”的值(“xxxxxxx”;)需要重定向到新文件。“用户”将始终位于第五目录中,但我不想要 .rstd 扩展名。我的新文件输出应该如下所示

user   "xxxxxxxx";
Run Code Online (Sandbox Code Playgroud)

我怎样才能最好地完成这个任务?

Joh*_*024 5

使用 sed

为了方便起见,让我们将 find 输出放入 shell 变量中s

$ s='/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";'
Run Code Online (Sandbox Code Playgroud)

现在,让我们提取您想要的部分:

$ echo "$s" | sed -E 's|/([^/]*/){4}([^/.]*)[.][^"]*(.*)|\2 \3|'
user "xxxxxxx";
Run Code Online (Sandbox Code Playgroud)

怎么运行的

sed 脚本由单个替代命令组成。该-E标志用于启用扩展正则表达式。

  • 该行与:/([^/]*/){4}([^/.]*)[.][^"]*(.*)

    /([^/]*/){4}匹配前四个目录。由于括号的原因,这些目录中的最后一个被保存为组 1,但我们不会使用它。

    ([^/.]*)匹配不带扩展名的用户名。由于括号的存在,该分组被保存为组 2。

    [.][^"]*匹配扩展名以及第一个双引号之前的所有内容。

    (.*)匹配从第一个双引号开始到行尾的所有内容。同样,由于括号的原因,这被保存为组 3。

  • 替换文本\2 \3表示第 2 组,后跟一个空格,后跟第 3 组。

使用 awk

$ echo "$s" | awk -v FS="/" '{ name=$6; sub(/[.].*/,"", name); sub(/[^"]*/, ""); print name, $0;}'
user "xxxxxxx";
Run Code Online (Sandbox Code Playgroud)

怎么运行的

  • -v FS="/"

    这会将字段分隔符设置为/

  • name=$6; sub(/[.].*/,"", name)

    由于 awk 对字段进行计数,因此名称位于第六个字段中。我们将第六个字段保存在变量中name,然后删除name第一个句点之后的所有内容。

  • sub(/[^"]*/, "")

    这会删除该行中直到但不包括第一个的所有内容"

  • print name, $0

    这将打印名称、字段分隔符(默认为空格)以及替换后该行剩下的内容(密码)。