sed を使用した結果の分析

sed を使用した結果の分析

こんにちは、duコマンドの結果を解析しようとしていますが、ループなしで実行する方法がわかりません。次のコマンドを実行します。

du -shm /var/vmail/mailboxes/domain/*/mail

私の結果は次のリストです。

80 /var/vmail/mailboxes/domain/USER1/mail 
150 /var/vmail/mailboxes/domain/USER2/mail 
220 /var/vmail/mailboxes/domain/USER3/mail 

上記のリストを次のようにjsonオブジェクトに変換したいと思います。

{USER1: 80, USER2:150, USER3:220 }

または、少なくとも何かを持っている必要があります:

80 USER1
150 USER2
220 USER3

私はこれを試しましたが、sed -e成功しませんでした。どんなアイデアがありますか?

答え1

努力する

du -sm /var/vmail/mailboxes/domain/*/mail |
  sed 's:/var/vmail/mailboxes/domain/::; s:/mail::'

どこ

  • s:/mail::/mail何も変わらない

JSONに移動

du -sm /var/vmail/mailboxes/domain/*/mail |
  sed 's:/var/vmail/mailboxes/domain/::; s:/mail::' |
  awk 'BEGIN { sep="{" ;} { printf "%s \"%s\":%s",sep,$2,$1; sep="," } END { printf "}\n"}'

答え2

du -shm /var/vmail/mailboxes/domain/*/mail | awk -F '[ /]' '{ print $1, $7 }'

du入力した形式で入力を使用すると、次のようになります。

80 USER1
150 USER2
220 USER3

プログラムawkは出力から適切なフィールドを選択するだけですdu。各行は、スペースまたはスラッシュで区切られたフィールドとして解釈されます。

awk -F '[ /]' '{ print $1, $(NF - 1) }'動作します。

JSONに変換するにはjq

du -shm /var/vmail/mailboxes/domain/*/mail |
awk -F '[ /]' '{ print $1, $7 }' |
jq -sR 'split("\n")[0:-1] | map(split(" ")) | map({(.[1]):.[0]}) | add'

これは生産します

{
  "USER1": "80",
  "USER2": "150",
  "USER3": "220"
}

このjq式は最初に入力を個々の配列要素(入力行ごとに1つ)に分割し、その要素を空白に基づいてサブ配列に再分割します。この時点で、私たちは

[
  [
    "80",
    "USER1"
  ],
  [
    "150",
    "USER2"
  ],
  [
    "220",
    "USER3"
  ]
]

次に、各サブ配列の2番目の要素をキーとして、最初の要素を値としてオブジェクトを作成します。

[
  {
    "USER1": "80"
  },
  {
    "USER2": "150"
  },
  {
    "USER3": "220"
  }
]

最後にadd私たちに最終結果を与えました。

答え3

awk以下を使用して2列形式に変換できます。

$ du -shm | awk -F/ '{print $1" "$(NF - 1)}'
80  USER1
150  USER2
220  USER3

JSONの場合は、以下を試してください。

$ du -shm | awk -F/ '{print "\""$(NF - 1)"\":"$1}' | paste -sd, | printf "{$(cat)}" | jq
{
  "USER1": 80,
  "USER2": 150,
  "USER3": 220
}

答え4

これは少し面倒ですsed。しかし、GNU sedに関する注釈付きの提案は次のとおりです。

解析.sed

s|([^ ]+) .*/([^/]+)/.*|  "\2" : \1,|   # Extract size and name in json-format
1h; 1!H                                 # Correctly add them to hold-space
$ {
  z                                     # Clear pattern-space
  s/^/\{/                               # Prepend start-curly-brace
  G                                     # Fetch formatted json from hold-space
  s/,$//                                # Remove last comma
  s/$/\n\}/                             # Append end-curly-brace
  p                                     # Print
}

次のように実行します。

du -shm /var/vmail/mailboxes/domain/*/mail | sed -Enf parse.sed

または1行で:

du -shm /var/vmail/mailboxes/domain/*/mail |
sed -Ene 's|([^ ]+) .*/([^/]+)/.*|  "\2" : \1,|;1h;1!H;${z;s/^/\{/;G;s/,$//;s/$/\n\}/;p}'

どちらの場合も出力:

{
  "USER1" : 80,
  "USER2" : 150,
  "USER3" : 220
}

関連情報