linux命令使用小记4


linux真的是学无止境,不要认为你已经熟练掌握常规命令了,比如grep了,下面就是一些例子。

grep –color与less -r

less -r表示显示控制字符,比如高亮,但是如果你希望less时显示grep的高亮的话,不能只指定grep –color,而要用grep –color=always,比如

grep --color=always foo foo.txt | less -r

grep的上下文

有些时候,你需要显示查找到的字符串的上下文,那么grep的ABC对你有用。
A表示after,参数值表示显示后面多少行。
B表示before,参数值表示显示前面多少行。
C表示context,参数值表示前后多少行。
比如

grep -C 5 foo foo.txt

grep –label

管道时用,比如

cat foo.txt | grep --label=foo.txt -H foo

如果没有label的话,显示的就是standard input。使用label后显示的就是foo.txt。

基于上面三个技巧的小例子

find -type f -name '*.java' | while read path;do iconv -f GBK -t UTF-8 $path | grep -FHn -C 5 --color=always --label=`basename $path` "中文"; done | less -r

上面的命令递归查找当前目录下的所有java文件(GBK编码的)是否包关键字“中文”。详细解释如下:

find得到一堆java文件路径。文件路径iconv和grep都需要,不得已用while代替xargs。
由于这些java文件编码是GBK的,需要用iconv转换为UTF-8,接下来再用grep分析。
C 5代表显示上下文各5行,–color=always表示高亮,–label这里用了路径的基本名,即文件名,最后使用less -r分屏幕输出。


3 responses to “linux命令使用小记4”

  1. 请问,grep能在UTF-8的语言环境下直接查找GBK编码的文件吗?
    类似用iconv将”中文”转换为GBK编码,然后直接Grep这个转码后的”中文”?

    因为我手头有一大批的GBK文件要修改,所以要经常Grep。而且修改一部分后要rsync到服务器上,所以将文本GBK iconv 到UTF-8 也不现实。

    • 笨方法:
      使用iconv转换GBK到UTF-8,输出到临时文件
      grep或者sed这个临时文件,就地修改
      最后iconv转换临时文件从UTF-8到GBK

      另外可以方法,LC=GBK?设置当前编码为GBK,grep/sed就地修改。

      • 临时文件的方法,我试过。我只能说文件非常多,速度很慢……

        LC_ALL=zh_CN.GBK在shell里可以方便的grep文件,但我在Emacs里的时候,想直接使用find-grep-dirte直接列出查找到文件列表,然后就可以直接修改源文件了。但是Emacs传递给find-grep-dirte的参数的是UTF-8的,所以没有结果。