从现在开始摘录一些自己认为常用或者有用的linux命令或者脚本, 可能很简单, 可能写得很戳, 欢迎拍砖, 让彼此进步!
1. 经常要在svn目录下面搜索一些py代码文件里面是否含有某些词语, 例如检查代码里面的TODO的tag, 方便在提交之前做好检查。那么, 可以这样做:
grep -inR 'TODO' . | grep -v .svn | grep -v .pyc | grep -v .swp
进一步可以把这个命令做成一个更简洁的sh脚本, 只需要接受要搜索的词语和要搜索的目录就可以了。然后放到PATH里面。
2. 有时候我们要在ps命令的输出里面查找某些关键字(比如某些进程名), 但是由于ps的输出有很多列, grep完关键字之后并不清楚哪一列对应的列名是什么(比如究竟是USER还是CPU?). 所以我想让列名在grep之后也出现, 就像表头一样。
那么我们可以利用sed来完成, 因为他是按行处理并且支持将参数command按照顺序执行。
思路就是: 用sed先把ps的列名截取出来然后再grep。
ps aux | sed -ne '1p' -e '/wsgi/p' | grep -v sed
写成一个sh脚本的话可以这样:
#!/bin/sh scriptname=`basename $0` word='' if [ $# -eq 1 ]; then word=$1 elif [ $# -gt 1 ]; then echo 'not support more than 1 parameter!' fi ps aux | sed -ne '1p' -e "/$word/p" | grep -v sed | grep -v $scriptname
3. 在vim里面, 想把文件的某些部分(第N到第M行,或者整个文件)拷贝到另一个文件可以这样做:
:N,M w newfile
如果想append内容到已有文件, 可以这样:
:N, M w >> newfile
如果被改写的文件是root的文件, 而你有sudo的权限的话, 要修改这样的root文件,可以这样:
:N, M w !sudo tee newfile
如果是想append内容到root权限的newfile, 要这样:
:N, M w !sudo tee -a newfile
4. ^foo^bar 这条命令能将上一条命令的第一个foo替换成bar, 这条命令被评为了linux10大最受欢迎命令了,
今天刚好用到,但是我的需求是替换所有的foo而不仅仅是第一个,按道理应该加一个类似正则里面的g参数就可以。
然后man sh, 查找^, 搜到原来这个命令等价于 !!:s/string1/string2/ , !!命令是获取上一条命令, s是替换命令,
就像sed里面一样, 然后manpage里面就找到要所有都替换的话是这样写的: !!:gs/string1/string2
功德圆满阿!不过就这样觉得其实描述这条命令的网页都没有最准确的描述, 应该强调下只是会替换第一个!!有木有!
5. 如果出现“Too many open files in system,connection closed错误”的话, 证明系统的文件句柄用完了。
那么如果查看文件句柄的情况和如何增加这个可用值就成了解决问题的关键了。
1)查看:
cat /proc/sys/fs/file-nr 会输入类似这样的值:
2688 0 65536
2688代表当前正在使用的句柄数; 0代表空闲的文件句柄数 ; 65536代表最大限制的文件句柄数量。
2)增加:
6. 使用sort实现类似数据库的group by功能
例子(filename: test.txt):
1,5,4
1,5,7
1,2,1
1,4,7
如果要按照前2列来排序group by, 那么可以通过这样的命令:
sort -t, -k1,2 test.txt
-k参数可以指定sort要排序的key是从哪个位置开始和结束, 不过缺点就是只能是一个连续的范围,
对不连续的没用。
如果你还需要在group by之后做统计, 那么用uniq -c 就可以了, 完整命令如下:
sort -t, -k1,2 test.txt | uniq -c