linux tips
比较两个文件夹下哪些文件有差异
[user@localhost mb]$ for i in * ; do echo $i; diff -w $i ../../pipeline2/mb; done
查找文件
find ./ -name *.cpp //查找当前目录下所有.cpp结尾的文件,自动递归查找子目录
find ./ -type f -maxdepth 2 //查找当前目录下所有文件(非文件夹),最多查找两级目录
查看文件被哪个进程占用
fuser filename #次命令会列出占用filename文件的PID,进一步可用下面命令查看进程
ps -ef | grep PID
查找并删除文件
find ./ -name *.cpp | xargs rm -rf //查找当前目录下所有.cpp结尾的文件,并强制删除
查找文件的内容
grep xxx ./ -rn //在当前目录及子目录查找带有xxx内容的文件,并且列出行号,(-r:文件夹递归 -n:列出行号)
git查看和历史版本的区别
git diff HEAD~2 xxx.cpp //查看xxx.cpp当前版本和上次提交版本的区别
ssh cloud server
ssh hw
rsync -av /tmp/test.txt hw:/tmp/text.txt
rsync -av /tmp/ hw:/tmp/
scp /tmp/dd.bin hw:/tmp/
以文件大小排序列出文件
ls -Sl 从大到小
ls -Slr 从小到大
大小写转换 gU转大写 gu转小写
gUw gUe 单词转大写
gU3w gU3e 3个单词大写
gU0 gU$ 当前位置到行首、行尾转大写
2gU 当前行以及后两行转大写
gUG 当前位置到文章末尾转大写
gU5G 当前行到第5行转大写
批量重命名文件
rename txt jpg * //将所有.txt重命名为.jpg
rename daily_srt daily_frt *.txt //将daily_srt_20180418.txt中的srt替换掉
添加具有sudo权限用户
visudo
找到 root ALL=(ALL) ALL这行,在下面增加一行
user ALL=(ALL) NOPASSWD:ALL //NOPASSSWD指明sudo时不用输入密码
指定user可以su sg,并且不需要密码
userALL=(sg) NOPASSWD:/bin/bash
//sudo 命令联网需要代理的情况
Defaults env_keep += "http_proxy https_proxy ftp_proxy no_proxy DISPLAY"
修改linux(centos7)计算机名称
vi /etc/hostname
user-w530
设置/取消代理
export http_proxy=http://*.*.*.*:8080
export https_proxy=http://*.*.*.*:8080
unset http_proxy
unset https_proxy
mount网络盘,比如群晖网络盘
sudo mkdir /software
sudo mount –o username=user,password=123456 //192.168.1.100/software /software
#CentOS8可能会报Operation not surpported错误,解决办法:
安装cifs,命令:yum install cifs-utils
安装cifs后,命令改为sudo mount -t cifs –o username=user,password=123456 //192.168.1.100/software /software,可能还会报错,继续在命令中加入版本信息即可:
sudo mount -t cifs –o username=user,password=123456,vers=1.0 //192.168.1.100/software /software
/etc/skel
/etc/skel目录下存有新建用户要拷贝的用户$HOME目录下的文件,比如.bashrc等
echo 时间
echo $(date +%F) //2018-05-16
echo $(date +%T) //10:23:00
echo $(date +%F%n%T) //2018-05-16 10:23:00
启动停止http服务
service httpd start 启动
service httpd restart 重新启动
service httpd stop 停止服务
git mergetool
git mergetool,解决冲突,在下方直接修改保留需要的内容
创建文件默认权限 umask
[user@localhost ~]$umask //查看umask值
[user@localhost ~]$0022 //新建文件默认权限是666,新建文件夹默认权限是777,要减去umask的值(按位减),如666-0022=644(rw-r--r--) 777-0022=755(rwxr-xr-x)
[user@localhost ~]$umask 0077 //修改umask值
ssh使用http代理
ssh -p 12345 49.4.0.* -o "ProxyCommand corkscrew 203.93.118.226 8080 %h %p"
提取一个文件的头尾若干行
[user@sg-server work]$ head –n 5 filename //输出filename的头5行
[user@sg-server work]$ tail –n 5 filename //输出filename的最后5行
[user@sg-server work]$ tail –n 5 filename > newfile //输出filename的最后5行到新文件new file
Git回退某个版本
git log filename命令查看各提交的版本
[user@sg-server sim]$ git log exec/xxx.cpp
commit 5b0030f89d3cd617f477f106fb7b50ef0ff79c68
Author: user<user@*.com>
Date: Fri Jun 1 17:13:12 2018 +0800
mod
commit c5f9e08acad35e77f8354f2e009eba6b72f169c4
Author: dd <dd@*.com>
Date: Fri May 25 18:55:59 2018 -0400
make arrival price more accurate in counting volume
然后checkout对应版本,具体命令:
git checkout c5f9e08acad35e77f8354f2e009eba6b72f169c4 exec/xxx.cpp
如果想将整个project或目录回退,则在相应目录下执行git log,找到commit标签,再git –reset –hard 标签(标签不用输全,头几位就行)
vim录制与回放操作
normal模式下按q+<x>,<x>可以是任意字母或数字,表示下面的操作用<x>来缓存,左下方显示recording表示进入录制模式,然后进行想要的操作。操作完成,按q退出录制。想要重复刚才的操作,按@+<x>即可。
MKL占用多CPU的问题
Linux部署了MKL,开发程序用到了MKL,运行程序时发现占用CPU非常高,经常占2000%,机器是20核40线程的CPU。后来发现是MKL的问题,运行export MKL_NUM_THREADS=1,后,程序占用CPU最多100%,而且运算时间并没变长,说明之前MKL自己用多核做了很多无用功。
wget下载ftp上的目录(包含子目录)
wget -nH -m --ftp-user=tom --ftp-password=123456 ftp://192.168.19.1/tom/
查看端口占用
netstat –tunlp | grep 端口号
查找并杀掉进程
ps –ef | grep 进程名字
上面命令会列出进程的PID,然后用kill 9 PID即可杀掉该进程。
setfacl给单独用户组或用户赋予文件/文件夹权限
$setfacl -R -m g:customer:r-x dirname #赋予customer组读和执行dirname文件夹的权限,-R是递归操作。执行完成后可以通过$getfacl dirname查看文件夹的用户及组权限。如果要赋予某个用户文件夹或文件的权限,将上面命令中的g改为u即可,要删除用户组的权限,用如下命令:
$setfacl -R -x g:customer dirname
rsync在机器间同步文件
rsync -azv --progress -e ssh --delete /tmp/ user@hw:/tmp/
rsync -avz --progress --exclude={*2019*,*2020*,*2021*,*2022*} sg:/sg/data/ ./
安装cx_Oracle
$python -m pip install cx_Oracle --upgrade
$rpm –ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
$rpm –ivh oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
暂停进程
$kill –stop PID
跟踪指定进程
$strace –p PID
Shell 输出到stdout stderr
stdout的文件描述符为1,stderr文件描述符为2
$echo ‘std msg’ > &1
定时观察
每隔1秒更新一下
$watch -n1 /tmp/rtc2 /tmp/file 000001
查看/等待文件更新
$tail –f filename –n 20 #查看文件最后20行,并等待更新
观察PID的IO情况
$iotop -p 4162
Linux远程分享屏幕
$tmux –S /tmp/bars new –s bar //创建分享
$tmux -S /tmp/bars attach -t bar //连接别人的分享
后台运行程序
$nohup ./test.sh
运行python程序时调试c++代码
首先c++的so要编译debug版本,python运行要加载so
p yest_uclose_prc_.mem[0]@10
info b //查看断点
dis 1 //disable 1号断点
TAR打包目录下的文件
$find /tmp/dir1 /tmp/dir2 –type f | grep –v “\.git\|\.bin\|\.swp$\|\.bak” | tar –czf backup.tgz --files-from -
注意--files-from,表示从文件中读取要压缩的文件列表,这里(-)从管道pipe中读取,也可以指定文件,比如—files-from files.txt(files.txt中的文件名以回车换行符分割)。
TAR只解压压缩包里的指定文件夹或文件
$tar xzf xxx.tgz dir1/dir2/ #只解压xxx.tgz中的dir1/dir2/文件夹下的所有文件
$tar xzf xxx.tgz dir1/test.c #只解压xxx.tgz中的dir1/test.c这一个文件
查看内存/CPU占用最多的进程
可以使用一下命令查使用内存最多的10个进程
$ps -aux | sort -k4nr | head -n 10
可以使用一下命令查使用CPU最多的10个进程
$ps -aux | sort -k3nr | head -n 10
ipython中通过X11绘图
import matplotlib.pyplot as plt
plt.plot(data)
vim查找以指定字符开头和结尾的字符串
norm模式下敲“/”,比如:
搜索“spec”开头的字符串,则输入/\<spec
搜索“spec”结尾的字符串,则输入/spec\>
搜索“spec”,全匹配,则输入/\<spec\>
Shell脚本逐行读取文件
$for i in cat `cat err.2016.txt`; do echo $i; done #效率第一
$while read LINE; do echo $LINE; done < err.2016.txt #效率第二,与前者相当
$cat err.2016.txt | while read LINE ; do echo $LINE ; done #效率第三
Shell脚本读取文件下所有内容
for i in *; do echo $i; done #列出当前目录下所有内容
for i in `ls -a`; do echo $i; done #列出当前目录下所有内容,包含隐藏文件
for i in `ls -F | grep ".*\/$"`; do echo $i; done #列出当前目录下所有文件夹(文件夹以/结尾)
linux异常邮件信息
/var/spool/mail/user
ls + xargs删除文件
删除当前文件夹下有后缀名但不是py和ini结尾的所有文件,保留文件夹。ls –F文件夹后面会带一个”/”。
ls -F | egrep '\w+(\.\w+)+$' | egrep -v "*.(py|ini)$" | xargs rm
如要删除所有文件,保留文件夹:
ls -F | egrep '.*?\w$' | xargs rm
nagios相关
nagios配置目录:
/etc/nagios
nagios网页相关配置:
/etc/nagios/cgi.cfg
/etc/httpd/conf.d/nagios.conf
Git 远程url地址
查看url地址:$git remote –v
修改url地址:$git remote set-url origin https://xxx
命令行中设置临时环境变量
$env LD_LIBRARY_PATH=$LD_LIBRARY_PATH:xxx <command>
防火墙打开端口
sudo firewall-cmd --query-port=8899/tcp
sudo firewall-cmd --zone=public --add-port=8899/tcp --permanent
sudo firewall-cmd --reload
Sed
Sed命令便于将相同的脚本命令应用于多个文件,例:
$sed –i ‘s/boy/girl/g’ `find . –name ‘*.txt’` #找出当前目录下所有的txt文件,并将boy替换为girl, -i表示修改原文件
上面命令中的s是替换的意思,还有其他几种动作类型。
动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作,通常这个 s 的动作可以搭配正规表示法。例如 1,20s/old/new/g。
$sed –i.bak ‘s/boy/girl/g’ `find . –name ‘*.txt’` #-i后面跟了.bak,则修改文件前会备份文件为*.txt.bak
根据命令Kill进程
Kill命令中有chrome的进程
$ps -aux | grep 'chrome' | awk '{{print $2}}' | xargs kill -9