以编程方式为printf构建字符串

时间:2014-10-19 13:27:47

标签: bash

我正在尝试建立一条彩色线条,以便打印到我的终端。

我正在使用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

我的输出被打印到单独的行上,所以它看起来像这样:

Current terminal output

但是,我希望每个错误都打印在自己的行上,如下所示:

desired output

我该如何做到这一点?


在收到一些优秀的答案后,我重构了我的脚本,看起来像这样:

#!/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

3 个答案:

答案 0 :(得分:1)

问题是cut命令在输出的末尾输出换行符\n

克服这个问题的一种方法是使用一些命令替换技术

例如

$printf "hello world" | cut -f1
hello world
$

可以修改为

output=`printf "hello world" | cut -f1`
printf $output
hello world$

在输出$

的末尾看到bash提示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