反向查看文件

tac, 也就是cat反过来, 从文件最后一行开始显示.

获得文件的绝对路径

readlink -f filename

也可以用realpath, 需要另外安装

去除重复行

可以使用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获得该pid相关的端口信息

lsof -Pan -p PID -i

由pid获得程序名字(name)

-p显示进程相关信息, -o指定输出的格式类型

ps -p pid -o comm=

查看文件内容

一般看文件前都不会看大小的, 所以用cat不合适, vim的话进到编辑器模式也麻烦
使用more可以一次显示一满屏幕内容, 按空格翻页, q退出, less相比就more, 就多了上下滚动的支持
这两者配合catgrep使用, 非常方便

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

仅匹配一行就停止

grep -m 1 'pattern' test.log

匹配多个关键词并且匹配一行就停止

grep 'pattern1' test.log | grep 'pattern2' -m 1

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"

quietin
761 声望44 粉丝

兴趣在程序语言, 高性能, 分布式等方面