之前做过两年的运维,用过很多命令,深切体会到某些linux命令熟练掌握后对效率提升有多大。举个简单的例子,在做了研发后经常会有跑一些数据,对于结果数据的处理,我们的产品同学一般都习惯于用excel做统计,把数据复制到excel里,然后数据分列,排序………… 最后得出某些简单的结论,我只需要cat, sort, uniq, awk, grep 这几个命令挥手间完成相同的操作。
这里我总结下我工作这几年用过的一些命令,当然,这里就不提那些vim cd ls mv cp 这种简单的命令了,如果你都不会这些命令的话,建议你先学习下。这里命令很多,我只简单列出几个我常用的参数。其实很多命令我也用的不是特别多,这篇文章我也只是希望能让大家知道有这样一个工具,但具体用如果想继续深入了解的话建议查看下手册,部分比较命令我也列出了有些参考资料。
目录/文件处理命令
mkdir dirname 创建文件夹
mkdir -p /tmp/a/b 递归创建目录
rm -rf dirname 删除目录及内部文件 -r:表示递归删除文件及文件夹;-f:表示强制删除,不提示
touch filename 创建文件
mv ins.war ins_new.war 重命名
mv ins.war webapps/ 移动文件到指定目录
cp index.jsp index_new.jsp 复制并重命名
cp -r ./nlzbTools2 /opt/webapps/ 将当前目录下的nlzbTools2目录复制到/opt/webapps/目录下 -r:递归持续复制,用于目录的复制行为
cp -r ./HouseProperty.war /opt/webapps/ 复制文件(将当前目录下的nlzbTools2.war文件复制到/opt/webapps/)
ls -ld /tmp/a 查看a目录的信息
scp 远程文件拷贝 条件:两台Linux局域网为局域网,能通信,无防火墙。注意:输入命令后有一次提示,输入【yes】即可,然后输入目标服务器账号的密码。
scp /gxxj/apache-tomcat-7.0.78-ins/ins.war jsdxadm@132.252.6.38:/data/ 将107服务器上的ins.war传到38服务器指定目录
scp /gxxj/apache-tomcat-7.0.78-ins/ins.war yangkun@132.228.125.45:/var/tomcat-7/ 将107服务器上的ins.war传到45服务器指定目录
scp -r /data/apache-tomcat-7.0.78-ins yangkun@132.228.125.45:/var/tomcat-7/ 将38上的Tomcat文件夹移到45机器上
scp /root/abc.zip root@192.168.1.102:/abc/ 要把 192.168.1.240上的 /root/abc.zip 传到 192.168.1.102机并放到/abc目录,可以在192.168.1.240机上用命令
scp -P 1234 /root/abc.zip root@192.168.1.102:/abc/ 若 SSH端口不是默认的22,比如,是端口1234 则加-P参数
压缩/解压命令
unzip -o ac.war 解压war文件
unzip abc.zip -d /home/kayak 解压文件到指定目录
tar -zcf Japan.tar.gz Japan
tar -xzvf apache-tomcat-7.0.69.tar.gz 解压tar.gz文件 x 解包 v 显示详细信息 f 指定解压文件 z 解压缩
zip -r GISutilzip20170105 GISutil 压缩文件 zip -r 压缩后文件名 需要压缩的文件名【较多用于文件夹备份】
zip -r /home/kms/kms.zip /home/kms/server/kms 压缩并指定目录
文件查看命令
vim cas.properties 查看文件,可编辑 wq保存并退出 ZZ保存并退出 q!强制退出并忽略所有更改 e!放弃所有修改,并打开原来文件
cat filename 查看文件内容(不适合查看长文件)
tac filename 同上,内容是倒过来显示的
more /etc/services 分页显示文件内容,适合长文件查看 空格或f:翻屏 回车:下一行 q:退出
less /etc/services 同上,但支持向上翻页,pageup:向上翻页 上下箭头:上下一行 输入/,加关键字可搜索,使用n查找下一个关键字位置
head -n 7 /etc/services 显示文件前7行内容
tail -n 3 /etc/services 显示文件最后3行内容
tail -f /var/log/messages 动态显示文件末尾内容
./startup.sh;tail -300f ../logs/catalina.out 边启动tomcat边查看日志(动态查看最新300行日志)
链接命令
ln -s [原文件] [链接文件] 创建链接,-s软链接
ln -s /etc/issue /tmp/issue.soft 创建文件/etc/issue的软链接/tmp/issue.soft
ln /etc/issue /tmp/issue.hard 创建文件/etc/issue的硬链接/tmp/issue.hard
软链接相当于Windows系统中的快捷方式,硬链接相当于cp -p,文件复制且同步更新
权限管理命令
chmod 777 filename 给文件分配读写运行权限(4读,2写,1可运行) 第一个数字代表文件所有者,第二个数字代表所在用户组,第三个数字代表其他用户
chmod 754 * 给当前目录的所有文件赋权,文件所有者可读可写可运行,用户组可读可运行,其他用户可读
chmod -R 777 /tmp/a 将/tmp/a目录及以下目录权限赋予777 -R:递归修改,不加该参数只是修改了a目录的权限,a目录下的子目录权限不变
chown username filename 改变文件所有者(change file ownership)
chgrp groupname filename 改变文件所属组
umask -S 以rwx形式显示新建文件缺省权限,即新建的文件有什么权限(注意:文件类型会自动去掉可运行权限)
umask 023 将新建文件的权限设置为754(rwxr-xr--) 023=777-754
用户管理命令
usaradd username 创建用户
passwd username 设置密码
userdel -r username 删除用户 -r 删除用户的同时删除用户家目录
groupadd groupname 创建用户组
su - username 切换用户 -:代表连带用户的环境一起切换 -c:仅执行一次命令,而不切换用户身份
sudo su - 切换用户
w 查看当前登录用户(详细)
who 查看当前所有登录用户
last 查看用户的登录记录,包括多次登录的记录
lastlog 查看所有用户的最后登录时间
touch /etc/nologin 禁止除了root以外的所有用户登录 该命令是在/etc目录下创建了一个nologin文件
passwd -l username 禁止指定用户登录
passwd -u username 解除被禁止登陆的用户
passwd -d username 清除指定用户的密码,可以无密码登录该用户
搜索命令
find [搜索范围] [搜索条件] 消耗资源,速度慢,最好不用
find / -name init 全盘搜索名为init的文件
find /etc -name init 在目录/etc中查找文件init(只有文件名为init的文件才会被搜索出来)
find /etc -name *init* 在目录/etc中查找文件名包含init的文件,*代表多个字符
find /etc -name init??? ?匹配单个字符
find -name *.text 查找以.text结尾的文件
find path -size +25k 查找指定目录下文件大小大于25k的所有文件 +表示大于,-表示小于,不写表示等于,单位k为小写,M为大小
find path -size +25M -a -size -30M 查找指定目录下文件大小大于25M并且小于30M的所有文件 -a表示and,-o表示or
locate filename 该命令建立资料库,系统会定期更新文件到资料库中,在资料库中查找,速度非常快。因为资料库不是实时更新,所以可能新建的文件查找不到。
updatedb 立即更新资料库,资料库不收录/tmp目录下的文件,即使updatedb,/tmp下的文件locate命令也查找不到
which cp 搜索cp命令所在的目录及别名信息
which useradd 搜索useradd命令所在的目录
whereis useradd 搜索useradd命令所在目录,以及帮助文档路径
grep -iv [指定字串][文件] 在文件中搜索字串匹配的行并输出 -i 不区分大小写
-v 排除指定字串 -n:输出行号
grep mysql /root/install.log 在install.log文件中查找mysql的行,并列出该行内容 --color=auto 搜索出的关键字用颜色显示
grep -v ^# /etc/inittab 去掉以#开始的行(注释行,^表示行首)
帮助命令
man ls 查看ls命令的帮助信息
man services 查看配置文件services的帮助信息
网络命令
write <用户名> 给用户发信息,以Ctrl+D保存结束(需要用户登录状态)
write linzhiling 给linzhiling用户发送信息,回车后书写要发的信息,前提是用户是已登录状态
wall [message] 发送广播信息,即给所有在线用户发送信息
mail <用户名> 给用户发送邮件,即使网络不通也可以使用
ping 192.168.1.2 给指定IP地址发送数据包,测试网络连通性,Ctrl+C 停止
ping -c 3 192.168.1.2 给指定IP地址发3次数据包
ifconfig 网卡名称 IP地址 查看和设置网卡信息
traceroute 显示数据包到主机间的路径
traceroute www.sina.com.cn 查看本机到新浪网的路由节点,一般用来查看哪个节点的网络出现问题
netstat 显示网络相关信息 -t TCP协议 -u UDP协议 -l 监听 -r 路由 -n 显示IP地址和端口号
netstat -tlun 查看本机监听的端口(udp没有监听状态,只有tcp有)
netstat -an 查看本机所有的网络连接 ESTABLISHED:正在连接的网络
netstat -rn 查看本机路由表
netstat -ano 查看端口号
netstat -nat|grep -i "8080"|wc -l 查看某端口连接数
setup 配置网络
文件系统常用命令
df hl 查看磁盘占用情况
du -sh 某目录占用磁盘空间大小,不包括子目录和目录下的文件 -s:显示目录占用的磁盘空间大小,不要显示其下子目录和文件占用的磁盘空间大小
du -h filename 指定文件占用的磁盘空间大小
du -ah --max-depth=1 查看某目录下全部文件及文件夹的磁盘占用大小和目录总占用空间大小 -a:显示目录占用的磁盘空间大小,
还要显示其下目录和文件占用磁盘空间的大小;-h:以人类可读的方式显示;不加--max-depth=1会把所有下下级等目录占用空间都列出来
系统命令
top 性能分析,动态显示内存(Mem),Cpu占用情况
sync 强制将缓存区数据写入硬盘,释放缓存区,sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件;echo 1 0 默认 ,1 清空页缓存, 2 清空inode和目录树缓存, 3 清空所有缓存。可以通过cat /proc/sys/vm/drop_caches命令查看。
free -m 相对于top 提供了更简洁的查看系统内存使用情况
free -9 突然终止运行的进程会导致系统资源无法释放,此时需使用free命令回收内存
kill -pid kill -signal pid 杀掉进程 pid是进程号,signal:1重跑(重启进程(以使配置生效等)),9强行终止进程,15结束
ps -ef|grep tomcat 标准格式显示含有tomcat的进程 -e:显示所有进程 -f:全格式
ps -eO lstart | grep tomcat 查看进程详细的启动时间
echo $PATH 查看系统环境变量
alias 查看别名
alias vi='vim' 设置别名,等号前后不要有空格
vi /root/.bashrc 让别名永久生效,修改配置文件即可
unalias 别名 删除别名
echo 1 > /proc/sys/vm/drop_caches 清除内存
历史命令
history 查看历史命令记录-c:删除历史命令记录 -w:把缓存中的历史命令写入历史命令保存文件~/.bash_history(正常情况下要等用户退出后才会把历史命令写入文件中)
cat ~/.bash_history 查看历史命令保存文件 默认保存1000条历史记录
注意
使用上下箭头调用以前的历史命令
使用“!n”重复执行第n条历史命令(history命令会列出历史命令,n可在列表中查看得到)
使用“!!”重复执行上一条历史命令
使用“!字符串”重复执行最后一条以该字符串开头的命令
服务器运行状态相关命令
ps
查看系统进程线程,我一般都是用这个命令查看进程pid的,然后用pid做更深入的排查。
基本用法
ps -aux 查看所有进程
ps -T -p ${pid} 查看某个进程的线程
参考资料
10个重要的Linux ps命令实战
pstree
查看系统进程树,他可以把各个进程之间的关系用树形结构标识出来。
基本用法
pstree
top
查看系统进程线程运行情况,包裹资源的使用情况,系统负载等。我的用法是看下服务器上负载是否很高,然后看具体是哪个进程,哪个线程占用cpu比较多。
基本用法
top 列出所有线程负载信息
top -H 列出所有线程的负载信息
top -H -p ${pid} 列出某个pid下所有线程的负载信息
free
查看内存及使用情况
基本用法
free
文件操作相关
cat
我都是用这个命令查看配置文件,或者是日志文件,但是有点需要注意,cat命令会把整个文件输出到终端了,如果文件内容非常多,建议使用grep进行过滤,或者直接用less或more命令。
基本用法
cat file.txt
tail
查看某个文件的尾部,或者查看标准出入的最末尾,默认值显示10行,可以用-n参数来指定输出多少行。
基本用法
tail -n 100 file.txt 输出最末尾的100行
tail -f file.txt 随着文件新增,持续输出新增的内容,一般用来看实时日志
head
和tail命令很相似,不过head是输出头部内容,个人感觉head远没有tail命令用的多。
基本用法
head -n 100 file.txt 输出最开始的100行
more
也是用来查看文件,但more命令只加载一屏的内容,可以向下翻动,因为加载的内容少,所以比cat快多了。
基本用法
more file.txt
less
和more很像,但是可以上下翻动,感觉less和more只需要less就可以了,完全可以去掉more啊
基本用法
less file.txt
grep
这个是我非常常用的一个命令了,尤其是在问题排查的时候,需要用grep从大量的数据中筛选出一些我想要的。 grep也支持正则表达式匹配。
基本用法
grep "abc" file 从file中筛选出包含 abc的行。
awk
开头我也说过,这个命令是我最常用的命令之一,比如在文件有多列的时候,我可以用awk输出具体某几列,或者做一些简单的统计 求和,求平均值啊,再或者做一下简单的数据格式化。
基本用法
cat data | awk '{print $1,$3,$5}' 输出第1 3 5列,注意下标是从1开始
cat data | awk '{ sum += $1 } END { print sum }' 对第一列求和
cat data | awk -F'\t' '{print $1,$3}' 把每行数据按tab分列,并输出1 3列
参考资料
阮一峰 awk介绍
sort
对标准内容做排序,
基本用法
cat file|sort 把file里的数据排序,注意是按字典序排的,如果想按数值排,需要能够加-n参数
cat file|sort -k2 -n -r 按第二列 数值 倒序 排序,-k指定第几列,-r是翻转reverse的意思
uniq
对排序好的内容去重,注意它只是把相邻且相同的去重,所以如果想要全局去重,需要先用sort排序。
基本用法
cat file|sort|uniq 把file里的文件排序并去重
cat file|sort|uniq -c 把file里的文件排序并去重,且输出每行出现的次数
wc
我都是用wc来数有多上行,其实wc不仅仅能数多少行,还可以数多少单词,多少字符。
基本用法
wc -l file 数下file里有多少行
wc -w file 多少个单词
wc -c file 多少个字节
wc -m file 多少个字符
参考资料
http://www.runoob.com/linux/linux-comm-wc.html
sed
parallel
linux大部分命令都是单进程的,这个命令可以让其他命令多进程执行。
参考资料
15分钟神器gnu parallel 入门观止
scp
之前运维大量机器的时候,通常需要批量修改某个配置文件,都是在一台机器上改好,然后用scp脚本分发到其他机器上去的,大大提高效率。
基本用法
scp aaa.txt test@192.168.1.3:/tmp/ 把当前目录下的aaa.txt文件通过192.168.1.3上的test账号放到/tmp目录下
scp test@192.168.1.3:/tmp/aaa.txt . 和上一条相反
磁盘及IO
du
查看目录大小
基本用法
du -h --max-depth=1 输出最深1层的目录,然后文件大小用人类可读的方式,比如1K 234M 2G
df
查看磁盘大小和占用情况
基本用法
df -h 查看各个分区的大小和使用情况
iostat
查看磁盘的io状态
iotop
可以类似于top目录一样,实时显示各个进程的io状态。
find
查找文件,查找条件可以是文件名,文件日期,文件大小,很强大。 我们之前服务器上有个磁盘满就强制删除服务器某个目录下大于1g,且时间大于2天,且文件名是*.log的文件,就是用find加xargs命令做的
基本用法
find /home/test -iname "test.txt 在/home/test/下找文件名为test.txt的文件,也支持通配符
find /home/test -isize +100M 查找/home/test下大于100M的文件
参考资料
wikipedia unix find
locate
定位某个具体文件的位置,locate命令要比find -name快得多,原因是它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db,这个数据库会通过一个cron定时更新,所以有可能新建的文件会检索不到。
基本用法
locate a.txt 定位a.txt的位置,如果系统中有多个a.txt,会全部显示出来。
tree
可以看到树状目录结构,
基本用法
tree -L 2 只显示两层树状结构
网络
ping
查看网络是否通
基本用法
ping www.baidu.com
nc
netcat,可以用来看远程某个端口是否打开,功能很强大,但是我用到的不多。
基本用法
nc -z xindoo.me 443 检测我服务器上的443端口是否开放(当然是开的)
参考资料
linux nc命令介绍
route
查看和操作本机路由表
基本用法
route 列出本地路由表
参考资料
百度百科 route命令
netstat
查看本机的网络状态,可以看到端口占用情况和网络链接情况。
基本用法
netstat -antp
traceroute
查看一个请求到目标服务器所经过的所有路由节点,一般用来排查网络问题。
基本用法
traceroute www.baidu.com
参考资料
百度百科 netstat
iftop
查看实时网络io情况
lsof
查看端口占用
dig
查看域名的信息,之前做运维的时候,经常需要验证某个域名解析改动是否生效,因为一般一个域名会-A到多个ip上,用ping命令只能看到一个ip,这个时候我就会用dig来看域名解析信息了。
基本用法
dig www.baidu.com
参考资料
dig 命令介绍
curl
发起一个http请求,我一般都是用这个命令来验证服务是否能正常访问的,它有获取html源码的功能。
基本用法
curl www.baidu.com
curl -I www.baidu.com 获取请求baidu.com的请求头
参考资料
curl的用法(英文)
wget
下载网络上一个文件,基本上就是有个命令行版的下载工具了。
基本用法
wget xindoo.me/test.txt 把我服务器上test.txt文件下载到本地
其他
yum|apt install
很多时候服务器上没有我们想要的工具,可以用这个命令安装下,yum是Fedora和RedHat以及CentOS中的Shell前端软件包管理器, apt是ubuntu平台上的。
基本用法
yum install curl
apt install curl
man
这个命令是用来查看其它命令手册的,可以看到具体某个命令的详细作用,和具体参数。这个是个很重要的命令了,一般他会比各命令自带的–help详细很多。
基本用法
man curl 查看curl命令的手册