こんにちは、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
}