Colors

防止手錶破色

  • October 17, 2014

我正在修改監控日誌文件的腳本,以挑出某些項目並為它們著色。最終輸出是幾列中的 6 位數字列表。我已經能夠~在數字的開頭添加 a,它不會破壞最終輸出中的任何內容,但它相當醜陋且難以閱讀。但是,當我嘗試在前面的 bash 腳本中或在 perl 腳本中對數據的最終處理中為數字著色時,顏色文本會被破壞。

例如,我將放入的原始號碼$num

123456

我在 perl 中輸入了這個(或者,在 bash 中幾乎相同):

"\e[1;34m" . $num . "\e[0m"

這就是我得到的:

[1;34m123456[0m 

我也試過這個,一個轉義版本,但得到同樣的東西:

"\x1B[1;34m" . $num . "\x1B[0m"

如果這有所作為,這裡是真正的腳本堆棧(一團糟):

  • Perl 呼叫內部 shell 腳本,然後通過管道傳送到grep/ cut/etc。
  • 帶有更多 /etc. 的 shell 腳本cut,然後通過管道傳輸到 .pl
  • shell 腳本監視輸出

也許watch不喜歡顏色呢?

perl不太清楚,所以我想展示我在列印行周圍看到的內容不會有什麼壞處:

my $format = ("%-8s") x scalar(@{$a[0]});

printf("$format\n", @$_)

我遇到了 watch 的“偷色”問題*,*這是因為 watch 使用簡單的 /bin/sh 輸出樣式,它破壞了任何顏色、別名、快捷方式……整個 shebang!

所以我把它拼湊在一起,放在我的*.bashrc*中,允許我使用我自己的所有別名、快捷方式和諸如此類的東西:

Usage:
   watcher 20 'somecommand | apipe | grep'

該數字是更新之間的延遲,以秒為單位,該命令可以包含您可以引用的任何內容。

###### 'watch' workalike, lets me use my aliases and such
function watcher() { WATCHERTIME=$1 ; WATCHERFILE=/tmp/watcher$$ ; shift ; while true ; do WATCHERHEIGHT=$(($LINES - 5)) ; ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null; clear ; /bin/echo -n "Every ${WATCHERTIME} seconds - " ; date ; /bin/echo ; cat ${WATCHERFILE} ; \rm -f ${WATCHERFILE} ; /bin/echo ; /bin/echo "==" ; sleep ${WATCHERTIME} ; done ; }

分解它:

function watcher()
{ 
 WATCHERTIME=$1
 WATCHERFILE=/tmp/watcher$$
 shift
 while true; do
   WATCHERHEIGHT=$(($LINES - 5))
   ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null
   clear
   /bin/echo -n "Every ${WATCHERTIME} seconds - "
   date
   /bin/echo
   cat ${WATCHERFILE}
   \rm -f ${WATCHERFILE}
   /bin/echo
   /bin/echo "=="
   sleep ${WATCHERTIME}
 done
}

它以行為單位確定目前螢幕高度,減去足夠的輸出以供自己的輸出,然後重複執行給定的命令,然後清除螢幕,顯示輸出並等待下一個循環。它在底部顯示一個簡短的“==”,表示輸出結束的地方。有時知道這一點會很有幫助。

我是這樣做的,所以顯示時的延遲最小。如果您不擷取輸出然後顯示,則會出現長時間的停頓,然後輸出… icky。

由於它不會破壞顏色,因此您可以獲得您習慣獲得的一切。享受!

引用自:https://unix.stackexchange.com/questions/41980