awk:フィールド交換時に出力フォーマットを保持

awk:フィールド交換時に出力フォーマットを保持

awkでフィールドを変更すると、文字列全体($ 0)が分割され、OFS(デフォルト<space>)を使用して再フォーマットされます。フォーマットが維持されるようにこの動作を抑制または変更するにはどうすればよいですか?

たとえば、df -hフィールド(列)は、1つ以上のタブとスペースで区切られたテーブルを出力します。すべての使用値(フィールド#5)> = 80%を太い赤で印刷し、テーブル構造を維持したいと思います。

df -h | awk '{ if($5 ~ /^[8-9][0-9]/) $5="\033[1;31m"$5"\033[0m"; print $0 }'

文字列の書式が再指定され、OFS=' '出力テーブルの書式が破損します。使用-v OFS='\t'

df -h | awk -v OFS='\t' '{ if($5 ~ /^[8-9][0-9]/) $5="\033[1;31m"$5"\033[0m"; print $0 }'

次の列が数桁離れた場所にタブ文字が配置されます。以下を使用して、各行の形式を強制的に変更しますelse {$5=$5}

df -h | awk -v OFS='\t' '{ if($5 ~ /^[8-9][0-9]/) {$5="\033[1;31m"$5"\033[0m"} else {$5=$5}; print $0 }'

列に到達するためにより多くのタブとスペースが必要な場合、テーブル構造はまだ破損します。

ベストアンサー1

もう1つのトリックは、awkのフィールドセパレータに「シングルスペース」をフィールドセパレータとして使用させることです。これを正規表現などの正規表現として定義し、行の-F'( )'末尾でカウントダウンされる列の修正を実行します。単一のスペースで区切られているので、最後から2番目の列を「いいね」で簡単にキャッチできます。Use%$(NF-1)$(NF-1)

df -h \
| awk -F'( )' '$(NF-1) ~ /^([5-9][0-9]|100)/ { $(NF-1)="\033[1;31m"$(NF-1)"\033[0m" }1'

さて、次のように使用することもできますgrep

df -h |grep -P '([5-9][0-9]|100)%(?=\s+/)|' --color

おすすめ記事