去除重复行
可以使用uniq
, 但要记得使用时先用sort
处理, 因为uniq
只处理相邻重复的行, 这是个坑点.
而sort -u
没有这个问题, 可以处理非连续的重复行
sort -u file
# 或者
sort file | uniq -ud
# 以下都只处理相邻的行
uniq -d file # 只输出file中的重复行,且只输出一次,但不输出唯一的行
uniq -u file # 只输出file中的唯一行
查看线程数
NUM=`ps M <pid> | wc -l | xargs` && expr $NUM - 1
本地获取在远程主机上的执行结果
ssh remote_host "ls > /tmp/file_on_remote_host.txt"
查看程序路径和文件类型
which 查看可执行文件的位置
whereis 查看文件的位置
whatis命令是用于查询一个命令执行什么功能
locate 配合数据库查看文件位置
type 显示命令的类型
find 实际搜寻硬盘查询文件名称
file 显示文件类型
列出和杀死进程
最常用的自然是ps -ef
, 然后grep
查看进程及其子进程最好是用pstree
, 能清楚显示父子关系
如果只需要进程号(一般都是为了杀死进程), 当然是用pgrep
, 它会过滤掉含grep
的进程;pkill
也是一样.
但是这两个命令默认是用程序名来杀进程的, 像python程序, 其程序名都是python二进程可执行文件的路径, 比如
/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
为了确保没有杀错进程, 通常使用-l
输出程序的名称信息, 使用-f
进行程序名匹配
pgrep -fl program
pkill -f -9 program
由pid获得程序名字(name)
-p
显示进程相关信息, -o
指定输出的格式类型
ps -p pid -o comm=
查看文件内容
一般看文件前都不会看大小的, 所以用cat
不合适, vim
的话进到编辑器模式也麻烦
使用more
可以一次显示一满屏幕内容, 按空格翻页, q退出, less
相比就more
, 就多了上下滚动的支持
这两者配合cat
和grep
使用, 非常方便
cat novel.txt | grep 'xxx' | more
查看压缩文件
zcat novel.gzip | grep 'xxx' | more
查看多个压缩文件
zcat novel-[1234].gzip | grep 'xxx' | more
显示本机主机名
在测试和线上环境中经常要查看主机名
hostname
或者网络节点名
uname -n
使用killall一次杀死多个进程
killall, 后跟程序名, 即可杀死该程序的所有进程, 默认和kill一样, 信号是SIGTERM
. 进程多的时候用于杀进程十分方便, 一般用于杀残留的多个子进程. 使用的时候还是建议用SIGKILL
, 也就是'-9'选项杀掉整个进程树
killall -9 programname
等同于
ps -ef | grep programname | awk '{ print $2 }' | xargs kill -9
会显示当前grep
的进程没有了, 没杀到, 不过不算大问题
后台运行程序
1.使用nohup忽略挂断信号,并将错误输出重定向到标准输出,且将标准输出丢弃
$ nohup program > /dev/null 2>&1 &
2.使用setsid让当前程序不属于接受 HUP 信号的终端的子进程,其父进程将是init进程,且无法通过jobs -l查看
$ setsid program > /dev/null
3.将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行
$ (program > /dev/null &)
清除memcached缓存
$ echo 'flush_all' | nc localhost 11211
批量杀死指定进程
注意从进程列表里去掉'grep'的进程
$ ps -ef | grep program | grep -v grep | awk '{print $2}' | xargs kill -9
time工具定时
time后面跟上所使用的命令即可,比如
$ time python program.py
结果可能是:
real 0m1.003s
user 0m0.002s
sys 0m0.005s
结果解释:
real - 表示实际的程序运行时间
user - 表示程序在用户态的cpu总时间
sys - 表示在内核态的cpu总时间
跨服务器拷贝指定文件
比如拷贝所有的.sh
文件,xargs
的-i
参数,用{}
就能代替管道之前的标准输出的内容
locate *.sh | xargs -i scp {} xxxx@xxxx:xxxx
或者
find / -name '*.sh' -exec scp {} xxxx@xxxx:/xxxx \;
还能使用rsync
,这个稍微麻烦点,就不展开了
grep搜索目录并排除指定目录
grep与find不同,用grep搜索是搜索的是文件内容,而不是文件名。所以下面的例子均是搜索文件内容中出现的http
单个目录
grep -E "http" ./ -R --exclude-dir=.git
多个目录
grep -E "http" . -R --exclude-dir={.git,res,bin}
多个文件
排除扩展名为 java 和 js 的文件
grep -E "http" . -R --exclude=*.{java,js}
-E表示使用扩展的正则表达式(GRE),否则就会使用基本的正则表达式-G(BRE),斜杠等需要转义就麻烦一些;-P 是 Perl 正则表达式,此模式支持的正则最完整,支持正则的完整度由大到小为: -P > -E > -G
grep搜索匹配文本
-A(after), 如显示匹配行及其后3行
grep -A 3 'pattern' test.log
要显示其前的3行则用-B(before)
要显示匹配行前3行到后3行呢, 可以用-A 3 -B 3
, 即
grep -C 3 'pattern' test.log
find查找文件
查找指定文件
以当前目录为例,使用.
指代
find . -name 'test.txt'
查找文件名中包含指定字符串的文件
使用*
进行模糊匹配,并且必须用引号包起来
find . -name '*mysql*'
进程间通信的操作
打印出当前系统中所有的进程间通信方式
ipcs
删除某种通信方式则用ipcrm
设置临时环境变量
有时你在普通用户权限下设置了环境变量,软件安装又需要sudo
权限,这时会提醒你变量没有设置,简单做法就是在sudo
后面直接贴上环境变量的设置语句
sudo LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so python -c "import numpy"