プロセス「検索」出力は特定のフィールドを解析します。

プロセス「検索」出力は特定のフィールドを解析します。

出力は次のとおりです。

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

この例では、「user」と「Password」(「xxxxxxx」;)の値を新しいファイルにリダイレクトする必要があります。 「Users」は常に5番目のディレクトリにありますが、.rstd拡張子は必要ありません。私の新しいファイル出力は次のようになります

user   "xxxxxxxx";

どうすればこれを行うことができますか?

答え1

sedを使う

便宜上、find出力をシェル変数に入れます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}最初の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はフィールド数を数えるので、名前は6番目のフィールドにあります。 6番目のフィールドを変数に保存しnamename最初の期間以降のすべての項目を削除します。

  • 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

Leku参考資料:
https://docs.raku.org/言語/regexes
https://docs.raku.org/言語/regexes-best-practices

関連情報