2014-10-29 3 views
1

Привет, я использую AWK для создания кучи представлений в нашем кластере.AWK или профиль bash добавляет нежелательные цветовые коды к stdout

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

производит что-то вроде -

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

КРОМЕ переменной $ 1 (myfiles100.txt), который был замещен в AWK заявлении, подсвечивается зеленым цветом синтаксиса. Я не знаю, связано ли это с моим профилем 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 

Цветовые коды вставляются как хорошо, но это приводит к путанице, когда я выполнить эти задания в планировщик. Я могу удалить цветовые коды с помощью команды nice sed.

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

Но должна быть какая-то настройка, которую мне не хватает, чтобы все было проще.

+2

почти наверняка env var для 'ls'. используйте 'ls --color = never -other opts'. Удачи. – shellter

+0

Спасибо! Конечно, это была проблема. global bash имеет опцию цвета ls – jwillis0720

ответ

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 распечатать ворота filename, на всякий случай, если имя файла содержит пробелы или другие забавные символы: они будут правильно процитированы (конечно, это предполагает, что ваши команды будут выполняться Bash на кластере). Я также использовал "$PWD" вместо вашего `pwd`, чтобы вы сохраняли подоболочку каждый раз, когда выполняется команда.

1

Звук ls Вы используете псевдоним для ls --color. Вы можете проверить это с помощью which ls. Одним из способов этого было бы указать полный путь при использовании ls. В большинстве случаев это /usr/bin/ls.

+0

Это то, за что 'command'. Поэтому 'command ls' вместо' ls'. Также '\ ls' работает, чтобы избежать псевдонимов. –

+0

Я всегда использовал 'alias ls =" ls --color = auto "' – gboffi