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

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

我发现输出如下:

/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";

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

user   "xxxxxxxx";

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

答案1

使用 sed

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

$ s='/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";'

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

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

怎么运行的

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";

怎么运行的

  • -v FS="/"

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

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

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

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

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

  • print name, $0

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

答案2

您可以使用sed分组来做到这一点,

$ echo '/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";' | \
sed 's,\(^/var.*stores/\)\(user\)\(.rstd.*= \)\(.*\),\2  \4,'
user  "xxxxxxx";

我知道这看起来很奇怪;) 或者你可以使用更简单的

sed -e 's,/var/data/run/stores/,,;s,\..*=,,'

答案3

很长......但似乎有效

$ echo '/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";'  | \
awk -F/ ' { print $6 $7} ' | awk -F"." ' { print $1, " ", $3 } ' | \
awk ' { print $1 " " $NF } '
user "xxxxxxx";

答案4

使用珀尔

~$ perl -pe 's{^(\/[^/]+){4}\/(\w+)\.rstd\/[^/ ]+\hPassword\h\=\h\"(.+)\"}{$2 $3};'   file

#OR (with \x option)

~$ perl -pe 's{ ^ ( \/ [^/]+ ){4} \/ (\w+) \. rstd \/  [^/ ]+ \h Password \h \= \h \" (.+) \" }{$2 $3}x;'  file

使用(以前称为 Perl_6)

~$ raku -pe 's{ ^ [ \/ <-[ / ]>+ ]**4 \/ (\w+) \. rstd \/  <-[ / \h ]>+ \h Password \h \= \h \" (.+) \" } = "$0 $1";'  file

#OR (much more explicitly)

~$ raku -pe 's{ ^ [ \c[SOLIDUS] <-[ \c[SOLIDUS] ]>+ ]**4 \c[SOLIDUS] (\w+) \.rstd \c[SOLIDUS]  <-[ \c[SOLIDUS] \c[SPACE] ]>+ \c[SPACE] Password \c[SPACE] \= \c[SPACE] \c[QUOTATION MARK] (.+) \c[QUOTATION MARK] } = "$0 $1";'  file

输入示例:

/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx"; 

示例输出(所有 4 个示例):

user xxxxxxx; 

Perl 参考资料:
https://perldoc.perl.org/perlrequick
https://perldoc.perl.org/perlre

乐库参考资料:
https://docs.raku.org/language/regexes
https://docs.raku.org/language/regexes-best-practices

相关内容