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”
请问,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的,所以没有结果。