出力は次のとおりです。
/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番目のフィールドを変数に保存し
name
、name
最初の期間以降のすべての項目を削除します。sub(/[^"]*/, "")
これにより、最初の行を除く行のすべての項目が削除されます
"
。print name, $0
これにより、名前、フィールド区切り文字(デフォルトでは空白)、および置換後の行に残った内容(パスワード)が印刷されます。