2014-10-29 52 views
1

您好我正在使用AWK生成一堆提交到我們的羣集。AWK或bash配置文件將不需要的顏色代碼添加到標準輸出

$ls myfiles* | awk '{for(i=1;i<101;i++){print("qsub -d `pwd` -v FILE="$1",NUM="i" -N "$1" run.qsub")}}' 

產生類似的東西 - 這是在awk的聲明取代

qsub -d `pwd` -v FILE=myfiles100.txt,NUM=100 -N myfiles100.txt run.qsub 

除了變量$ 1(myfiles100.txt),在綠色的語法高亮顯示。我不知道這是由於我的bash配置文件還是AWK的東西,但我從來沒有見過它。當我將其重定向到stdout時,問題就出現了。

$ls myfiles* | awk '{for(i=1;i<101;i++){print("qsub -d `pwd` -v FILE="$1",NUM="i" -N "$1" run.qsub")}}' > somefile.txt 

當我打開somefile.txt

qsub -d `pwd` -v FILE=^[[0m^[[32mmyfiles100.txt^[[0m,NUM=100 -N ^[[0m^[[32myfiles100.txt^[[0m run.qsub 

顏色代碼插入爲好,但這會導致混亂,當我執行這些作業調度程序。我可以用一個很好的sed命令刪除顏色代碼。

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" 

但必須有一些設置我失蹤使事情變得更容易。

+2

幾乎肯定是'ls'的env var。使用'ls --color = never -other opts'。祝你好運。 – shellter 2014-10-29 22:00:28

+0

謝謝!當然這是問題所在。全局bash有ls顏色選項集 – jwillis0720 2014-10-29 22:06:45

回答

2

You're not supposed to parse the output of ls

在特定情況下,更好的做法只是這樣做:

printf '%s\n' myfiles* | awk '{for(i=1;i<101;i++){print("qsub -d `pwd` -v FILE="$1",NUM="i" -N "$1" run.qsub")}}' 

這裏是一個純粹的Bash可能達到你想要什麼:

for file in myfiles*; do 
    for i in {1..100}; do 
     printf 'qsub -d "$PWD" -v FILE=%q,NUM=%d -N %q run.qsub\n' "$file" "$i" "$file" 
    done 
done > somefile.txt 

我曾經%q打印出來的文件名,以防萬一文件名包含空格或其他有趣的符號:這些將被正確地引用(當然,這假定您的命令將由羣集中的Bash執行)。我還使用了"$PWD"而不是你的`pwd`,這樣每次執行該命令時都會保存一個子shell。

1

聽起來好像您使用的lsls --color的別名。你可以用which ls來檢查。解決這個問題的一個方法是在使用ls時指定完整路徑。在大多數情況下,它是/usr/bin/ls

+0

這是'command'的用途。所以'命令ls'而不是'ls'。 '\ ls'也可以避免別名。 – 2014-10-29 22:18:09

+0

我一直用'alias ls =「ls --color = auto」' – gboffi 2014-10-29 22:22:01

相關問題