为什么在从grep输出创建文件时我会得到一些额外的,奇怪的字符?

时间:2013-07-16 18:24:35

标签: bash unix grep

我正在做一个非常基本的命令,过去从来没有给我带来麻烦,但现在莫名其妙地回复了不受欢迎的角色。

我在linux上使用BASH,只想搜索目录并创建一个包含与模式匹配的文件名的文件:

ls | grep "*.file_ID" > my_list.txt

...这很好用,如果我抓住数据:

   cat my_list.txt
       seriesA.file_ID
       seriesB.file_ID
       seriesC.file_ID

但是,当我尝试将此文件提供给下游进程时,我不断收到一些奇怪的错误,就好像该文件没有正确格式化为文件名列表一样。当我在vim中打开文件以显示任何不必要的字符时,我发现文件实际上是这样的:

vi my_list.txt

^[[00mseriesA.file_ID^[[00m
^[[00mseriesB.file_ID^[[00m
^[[00mseriesC.file_ID^[[00m

出于某种原因,每一行都以字符^[[00m开始和结束。如果我删除这些字符,所有下游进程都可以正常工作。但是,我需要让我的脚本自动生成这样的文件列表,所以我不能继续进行并手动删除这些字符。

有谁知道产生^[[00m个字符的是什么?我不知道它们来自哪里,并且需要能够在没有它们的情况下生成文件。

谢谢!

5 个答案:

答案 0 :(得分:8)

可能您的GREP_OPTIONS环境变量包含--color=always,这会导致输出中包含控制字符,即使是通过管道传输到文件中也是如此。

改为使用--color=auto

http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html

更好的是,不要使用grep

ls *.file_ID > my_list.txt

答案 1 :(得分:1)

Don't use ls

printf "%s\n" *.file_ID > my_list.txt

答案 2 :(得分:1)

这应该照顾它(假设GNU查找并且没有目录遍历):

find . -maxdepth 1 -type f -name "*.file_ID" -printf "%f\n" > my_list.txt

示例:

~> ls *file_ID*
a.file_ID  b.file_ID  c.file_ID

~> find . -maxdepth 1 -type f -name "*.file_ID" -printf "%f\n" > my_list.txt

~> cat my_list.txt
a.file_ID
b.file_ID
c.file_ID

就“^ [[00m”字符而言,检查你的选项:

~> alias -p | grep "ls="

你可能会得到类似的东西:

alias ls='/bin/ls $LS_OPTIONS'

如果是这样,请检查env:

~> env | grep LS_OP
LS_OPTIONS=-N --color=tty -T 0

您引用的字符串用于关闭颜色,因此您的shell可能已设置为显示颜色。删除和/或更改ls别名应该解决它。

答案 3 :(得分:1)

  • 通常是自动=> grep --color=auto

  • 如果它通过管道传输到看起来像^[[00...^[[00m

  • 的csv文件中
  • 您必须在终端中输入以下内容:
    grep --color=auto "your regex" > example.csv

  • 如果您希望永久避免每次不必键入“ --color=auto”,请在终端中输入以下内容:
    export GREP_OPTIONS='--color=auto'

更多信息: https://linuxcommando.blogspot.com/2007/10/grep-with-color-output.html

答案 4 :(得分:0)

奇怪的字符如^[[00m是用于着色输出的转义字符。 ls的颜色输出很可能是通过环境中的别名启用的。

为避免获取这些颜色字符,您可以尝试使用反斜杠暂时禁用ls别名:

\ls *.txt

或者您可以使用printf命令。

printf "%s\n" *.txt