2014-10-29 49 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

相关问题