Open1

terraform plan結果をファイル出力する時、文字化けを除去する方法

konbu33konbu33

terraform plan結果をファイル出力する時、文字化けを除去する方法

macOSの場合

brew install ansifilter

# terraform
logFile=terraform.plan.$(date '+%Y%m%d_%H%M').log
terraform plan | ansifilter | iconv -f UTF8 | col -b | tee $logFile

# script
# script -Fオプションを指定し、1コマンド単位で出力する。
# gawkのstrftime("%F %T ") を指定し、出力の1行毎に、行頭に日時を付加する。
# macOSの場合、strftimeは、awkでは指定付加のため、gawkを利用する。
# gawkの{fflush() }を指定し、バッファせずに、即時出力する。
# ansifilterを通して、文字化けを除去する。
# scriptの>(コマンド >> $logFile)と指定することで、標準出力 + ファイル出力する。
# teeコマンドだと、コマンド実行毎に、改行が出力される?ので、>>を利用。
# PS1に%D{%F %T}を付加し、プロンプト行頭に日時を表示することで、各ログの行頭に日時を出力可能。
# && exitすることで、scriptコマンドからのexitを意識しなくて済む。
# .zshrcではなく、.zprofileに関数定義することで、ログイン時のみ実行されるようにする。※zshコマンド実行してもロギング開始させない。

str=$(cat << 'EOS'
export PS1="%D{%F %T} %n@%m %1~ %# "PS

EOS
)

echo "$str" >> ~/.zprofile
source ~/.zprofile

str=$(cat << 'EOS'
function recordOpeLog() {
    currentDate=$(date '+%Y%m%d_%H%M%S')

    logDir=~/.opelog/
    if [ ! -e $logDir ]; then mkdir -p $logDir; fi

    logFile=${logDir}opelog.$currentDate.log
    script -Fq >(gawk '{print strftime("%F %T ") $0} {fflush()}' | ansifilter >> $logFile) && exit
}
recordOpeLog

EOS
)

echo "$str" >> ~/.zprofile
source ~/.zprofile

Windows WSL Ubunutの場合

apt install ansi2txt
# terraform
terraform plan | ansi2txt | iconv -f UTF8 | col -b | tee terraform.plan.$(date '+%Y%m%d_%H%M').log

# script