我正在尝试建立一条彩色线条,以便打印到我的终端。
我正在使用Ruby将文件写入文件。
def warn(line)
log = File.open("#{File.dirname(__FILE__)}/../../log/import/import.log", "a")
log.puts("WARN #{line}")
log.close
end
写入日志文件的典型行如下所示:
WARN Client insertion failed: [149] Validation failed: Email is invalid
我正在使用tail
tail -F -n 0 log/import/import.log | script/report.sh
脚本我将tail
输出管道输出如下:
#!/bin/bash
set -e
while read LINE; do
case "$LINE" in
"file truncated")
clear
;;
INFO*)
tput setaf 6
echo "${LINE:5}"
tput sgr0
;;
WARN*)
tput setaf 1
printf "${LINE:5}" | cut -d ":" -f1
tput sgr0
printf ": "
tput setaf 3
printf "["
tput sgr0
printf "${LINE:5}" | cut -d "[" -f2 | cut -d "]" -f1
tput setaf 3
printf "]"
tput sgr0
printf "${LINE:5}" | cut -d "]" -f2
printf "\n"
;;
*)
echo "$LINE"
;;
esac
done
我的输出被打印到单独的行上,所以它看起来像这样:
但是,我希望每个错误都打印在自己的行上,如下所示:
我该如何做到这一点?
在收到一些优秀的答案后,我重构了我的脚本,看起来像这样:
#!/bin/bash
set -e
printfg() {
tput setaf $3
printf "$1" "$2"
tput sgr0
}
while read LINE; do
case "$LINE" in
"file truncated")
clear
;;
INFO*)
printfg "%s\n" "${LINE:5}" 6
;;
WARN*)
IFS="[]" read error number reason <<< "$(echo "${LINE:5}")"
printfg "%s" "$error" 1
printfg "%s" "[" 3
printf "%s" "$number"
printfg "%s" "]" 3
printf "%s\n" "$reason"
;;
*)
echo "$LINE"
;;
esac
done
答案 0 :(得分:1)
问题是cut
命令在输出的末尾输出换行符\n
。
克服这个问题的一种方法是使用一些命令替换技术
例如
$printf "hello world" | cut -f1
hello world
$
可以修改为
output=`printf "hello world" | cut -f1`
printf $output
hello world$
在输出$
hello world
答案 1 :(得分:1)
此行中cut
的最终通话
printf "${LINE:5}" | cut -d "[" -f2 | cut -d "]" -f1
生成换行符,因为它输出完整行。相反,使用
code=${LINE:5}; code=${code%*}; printf "$code";
答案 2 :(得分:1)
您可以使用cut
并以这种方式设置read
来避免IFS
:
LINE="WARN Client insertion failed: [149] Validation failed: Email is invalid"
case "$LINE" in
WARN*)
IFS="[]" read error number reason <<< "$(echo "${LINE:5}")"
# echo "$error | $number | $reason"
tput setaf 1
printf "%s" "$error"
tput sgr0
# printf ": "
tput setaf 3
printf "["
tput sgr0
printf "%s" "$number"
tput setaf 3
printf "]"
tput sgr0
printf "%s" "$reason"
printf "\n"
;;
esac