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

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

出力は次のとおりです。

/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

    これにより、名前、フィールド区切り文字(デフォルトでは空白)、および置換後の行に残った内容(パスワード)が印刷されます。

おすすめ記事