做后端开发,每天都要和Linux服务器打交道。部署代码、查看日志、排查问题、管理进程,这些操作都离不开命令行。但我发现很多同事(包括以前的我自己),只会用ls、cd、cat、ps这些最基础的命令,遇到复杂一点的操作就束手无策,或者写一堆冗长的命令,效率很低。
其实Linux命令行非常强大,掌握一些技巧和组合命令,能让你的工作效率翻倍。今天就来分享十个我日常工作中最常用、最实用的命令行技巧,每一个都是经过实战检验的。
技巧一:history和!快速执行历史命令
我们在命令行输入的每一条命令,都会被记录到历史记录里。用history命令可以查看最近执行过的命令,默认显示1000条。
但很多人不知道的是,可以用!快速执行历史命令。比如:
!!:执行上一条命令!-2:执行倒数第二条命令!ls:执行最近一条以ls开头的命令!ls:p:只显示最近一条ls命令,不执行(用来确认命令是否正确)
还有一个更强大的:Ctrl+R反向搜索历史命令。按下Ctrl+R,输入关键词,会自动匹配最近一条包含该关键词的命令,按回车执行,按方向键可以编辑。这个技巧我每天要用几十次,非常高效。
技巧二:tail -f实时查看日志
排查线上问题时,最常用的操作就是查看日志。用cat查看整个日志文件太慢,用grep搜索又看不到实时更新。这时候tail -f就是神器:
tail -f /var/log/nginx/access.logtail -f会实时显示文件的最新内容,有新的日志写入时会自动刷新,相当于"跟着日志走"。排查问题时开一个终端跑tail -f,然后在另一个终端复现问题,日志实时滚动,问题一目了然。
如果想同时查看多个日志文件,可以这样:
tail -f /var/log/nginx/access.log /var/log/php-fpm/error.logtail会同时显示多个文件的内容,并用文件名标注每条日志来自哪个文件。
技巧三:grep高级用法
grep是文本搜索的利器,但很多人只会用grep keyword file这种基础用法。其实grep有很多强大的选项:
grep -r keyword dir/:递归搜索目录下所有文件grep -i keyword file:忽略大小写grep -v keyword file:反向匹配,显示不包含关键词的行grep -n keyword file:显示行号grep -c keyword file:只显示匹配的行数grep -A 5 keyword file:显示匹配行及后面5行grep -B 5 keyword file:显示匹配行及前面5行grep -C 5 keyword file:显示匹配行及前后各5行
比如排查PHP错误时,我常用:
grep -rni "fatal error" /var/log/php-fpm/递归搜索php-fpm日志目录下所有文件,忽略大小写,显示行号,找出所有Fatal Error。
技巧四:awk和sed处理文本
遇到需要批量处理文本的场景,awk和sed是神器。
awk擅长按列处理文本。比如统计Nginx访问日志中每个IP的访问次数:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20这条命令的意思是:用awk取出日志第一列(IP地址),排序,去重计数,按次数倒序排列,取前20名。一条命令就能找出访问量最高的20个IP,排查CC攻击时非常有用。
sed擅长文本替换。比如批量把文件中的http替换成https:
sed -i 's/http/https/g' config.php-i表示直接修改文件,s是替换命令,g表示全局替换(不加g只替换每行第一个匹配)。
还有一个常用的:删除文件中的空行:
sed -i '/^$/d' file.txt技巧五:find查找文件
find是Linux下最强大的文件查找工具,但很多人只会用find . -name "*.php"。其实find的功能非常丰富:
find . -type f -name "*.log":查找当前目录下所有.log文件find . -type d -name "cache":查找名为cache的目录find . -mtime -7:查找7天内修改过的文件find . -size +100M:查找大于100MB的文件find . -name "*.tmp" -delete:查找并删除所有.tmp文件find . -name "*.log" -exec tail -n 5 {} \;:查找所有.log文件并显示每个文件的最后5行
比如清理服务器上的临时文件,我常用:
find /tmp -type f -mtime +7 -delete删除/tmp目录下7天前的临时文件,安全又高效。
技巧六:du和df查看磁盘空间
服务器磁盘满了是常见问题,用df查看磁盘使用情况:
df -h-h表示以人类可读的格式显示(GB、MB而不是字节数)。
但df只能看到整个分区的使用情况,想知道哪个目录占用空间最大,要用du:
du -sh /var/* | sort -rh | head -10这条命令会显示/var目录下每个子目录的大小,按大小倒序排列,取前10名。-s表示只显示汇总大小,-h表示人类可读格式。找到占用空间大的目录,再进去逐层分析,就能定位到具体是哪些文件占了空间。
技巧七:top和htop查看进程
top是Linux下的任务管理器,用来查看系统运行状态和进程信息。直接输入top就能看到CPU使用率、内存使用、进程列表等信息。
top里有几个常用的交互命令:
- 按P:按CPU使用率排序
- 按M:按内存使用率排序
- 按k:杀死进程(输入PID)
- 按q:退出
如果觉得top不够直观,可以装htop,一个更友好的进程查看工具,支持鼠标操作、颜色显示、树形进程结构等。Ubuntu/Debian下用apt-get install htop安装,CentOS下用yum install htop。
技巧八:nohup和&后台运行
有时候需要在服务器上跑一个长时间的任务(比如数据导入、批量处理),但SSH连接断开后进程就会被杀掉。这时候需要用nohup和&让进程在后台运行:
nohup php import.php > import.log 2>&1 &- nohup:忽略挂断信号,SSH断开后进程继续运行
- &:把进程放到后台
- > import.log:把标准输出重定向到import.log文件
- 2>&1:把标准错误也重定向到标准输出(也就是都写到import.log)
这样,即使SSH断开,import.php也会继续在后台运行,日志写到import.log里。用tail -f import.log可以实时查看进度。
查看后台进程用jobs,把后台进程调到前台用fg %1(1是jobs里的编号)。
技巧九:alias设置命令别名
有些命令很长,每次输入很麻烦,可以用alias设置别名。比如:
alias ll='ls -alh'
alias gs='git status'
alias ga='git add .'
alias gc='git commit -m'
alias nginx-reload='sudo service nginx reload'把这些别名写到~/.bashrc文件里,每次登录自动生效。这样输入ll就等于ls -alh,输入gs就等于git status,能省不少时间。
我还设置了一个很实用的别名:
alias ports='netstat -tulanp'输入ports就能查看所有端口的监听情况,排查端口占用问题时非常方便。
技巧十:xargs批量操作
xargs可以把标准输入转换成命令行参数,用来批量操作非常方便。比如批量删除所有.tmp文件:
find . -name "*.tmp" | xargs rm -ffind找出所有.tmp文件,通过管道传给xargs,xargs把文件名作为参数传给rm命令执行。
再比如批量修改文件扩展名,把所有.txt改成.md:
find . -name "*.txt" | xargs -I {} mv {} {}.md-I {}表示用{}作为占位符,xargs会把每个文件名替换到{}的位置。
还有一个常用场景:批量杀掉包含某个关键词的进程:
ps aux | grep "php-fpm" | grep -v grep | awk '{print $2}' | xargs kill -9找出所有php-fpm进程的PID,然后批量杀掉。当然,更规范的方式是用service php-fpm stop,但紧急情况下这条命令很管用。
总结
以上十个Linux命令行技巧,是我日常工作中最常用的。命令行的魅力在于,它看似枯燥,但一旦熟练掌握,效率会远超图形界面。而且这些技巧是通用的,不管是Ubuntu、CentOS还是Debian,不管是物理机、虚拟机还是云服务器,都能用。
学习命令行没有捷径,多用、多练、多查man手册,慢慢就熟练了。希望这篇文章能对你有所帮助。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录