终端下的常用操作

789 阅读11分钟

hey~大家好,今天要给大家分享的是一个相对基础的主题:终端下的基本操作,相信很多同学对于终端有着抵触的看法,认为哎呀终端有什么好用的有那么多难记的命令,用界面优美的GUI应用程序它不香吗,那么这篇文章笔者会带领大家认识一下终端,文章总共分三部分:第一部分笔者会介绍一些终端下的常用命令,第二部分笔者会配合几个场景展示一下如何用命令去解决一些问题,最后一部分会给大家分享一些提高效率的插件。希望大家阅读完这篇文章后能在日常工作中多用使用终端来完成工作,相信我这可以大大提高我们的工作效率。

笔者以mac系统为例,终端采用的是iterm(超越mac下自带的终端),shell用的zsh(当然并不代表zsh就是最好用的shell,这个看个人习惯,大家也可以将自己终端上的bash,fish等等打造成自己熟悉的shell环境),话不多说我们开始~

image

一、常用命令篇:

1、man命令,可以理解为命令的说明手册,只要遇到不会的命令或者一时想不起来这个命令怎么使用的时候,可以用man command,会在终端下打印出该命令的详细说明。这里我推荐给大家一个叫tldr(too long,don’t read.)的命令,它会比man命令更加精简。man命令和tldr命令都可以很方便的查询一个命令的使用方法。

image

2、grep命令,用法:

image

grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来,全称是Global Regular Expression Print,使用上十分灵活。对于经常查日志的同学会很有帮助。一行grep abc xxx.log命令即可在终端输出xxx.log文件中含有abc关键词的行。grep也可带一些参数-v代表不包含,-i代表忽略大小写,也可支持正则表达式搜索,例如:日志文件中每行都会存在一个时间戳,利用正则表达式来搜索指定时间段的行。当然,grep还有很多用法就不一一举例了,建议大家多多使用这个命令。

image

3、tail和head命令,用法:

image

tail使用方式有两种,一种是tail -f file监听文件变化,一种是tail -n xxx file来输出文件倒数第xxx行,head -n xxx file用来输出文件正数xxx行,经常配合grep使用。tail -f file | grep xxx监听文件含有xxx行的内容变化。ll -t | head -n 10来输出当前目录下最新变更的10个文件。

image

4、awk命令,用法:

image

awk提供了极其强大的功能:用来处理数据和生成报告(excel)。处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入。这个命令多用于将一行文本按照自定义分隔符分割为多个列,然后筛选出想要的列,可用来输出也可用来统计。常见的方式就是统计线上日志的接口调用量,直接awk出来接口url路径那一列,配合sort命令和uniq命令进行统计。完整语法:awk 'BEGIN{commands} pattern{commands}END{commands} ' file,篇幅有限大家可以翻阅awk的文档,最好的学习方式就是多实践。

image

5、top命令,用法:

image

top命令是Linux下常用的性能分析工具,实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。运行top命令会进入top模式,里边有很多指标,详细解释可参考www.cnblogs.com/peida/archi…,进入top模式后会有很多列,经常查看的是cpu列、mem列,cpu排序按P键,mem排序按M键,查看进程完整路径按c键,top命令默认显示所有进程。想要查看某个进程,需先使用ps命令,找到想要查询的进程号之后使用top -p 进程号即可。

image

6、lsof命令,用法:

image

lsof命令是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件,如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。由于应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。我经常使用lsof -i:port来查看某个端口是不是被占用了,用lsof -p 进程号来查看某个进程占用文件描述符的信息加上grep LISTEN就可以查看该进程占用的端口信息。

7、ansible命令github.com/ansible/ans…,用法:

image

之前说的命令都是在一台机器上执行的,那么我们有时候会需要在多台机器上执行相同的命令,这时候ansible就派上用场了,ansible可以批量执行远程命令,可以批量部署下载文件,这对于运维同学来说是个非常不错的工具,详细使用大家可以查阅相关文档。

8、nc命令,用法:

image

nc可用来探测端口,nc -vz ip port:扫描ip:port的tcp连接,nc -uz ip port:扫描ip:port的udp连接,比如某个服务是否挂掉了可以用这个命令确定下,nc也可用来传输文件blog.csdn.net/u012486730/…

image

8、netstat命令,用法:

image

netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。常用参数-t或–tcp 显示TCP传输协议的连线状况。-u或–udp 显示UDP传输协议的连线状况。-p或–programs 显示正在使用Socket的程序识别码和程序名称。-n或–numeric 直接使用IP地址,而不通过域名服务器。-l或–listening 显示监控中的服务器的Socket。所以基本上都直接用netstat -tunlp来查看当前机器正在监听的tcp udp的情况。

二、实践篇:

哇线上出问题啦,快查日志:

1、如果可以定位到时某台机器出错了,大家一般会执行以下步骤:

  • 先ssh到某个机器上,ssh需要输入密码,如果每次都需要输入密码就有些太麻烦了(iterm支持按某个键发送某个文本),可以将本机的证书发到机器上实现免密登录,也可以写个expect实现免密登录www.cnblogs.com/Shoudler/p/…
  • ssh到机器上后cd到具体目录然后grep错误码,awk筛选想要的信息,tail + grep看看还有没有报错之类的,到这里基本上可以定位错误日志了。

2、由于用户流量一般都是以负载均衡的方式打到后边很多机器上,所以是定位不到某台机器的,这时候如果每台机器我们都要ssh的话太不可取了,可以用如下步骤解决:

  • ansible提前把相应的机器配置好执行批量grep + tail + awk的命令,看看是哪台机器上抛出了该日志,但ansible也有缺点,就是日志文件必须是结对路径,如果目录层级很深的话我需要写很长很长一串路径(而且没有自动补全~),再加上ansible本身命令就很长,会觉得效率很低,而且万一忘记了路径就很尴尬了。
  • 为此我自己写了个remote-tailremote-grep,这两个其实就是模拟了多台ssh执行命令的过程,方便的地方是只需配置好,包括日志文件地址,机器ip等等之后就可以实现多台机器grep,多台机器tail的需求,项目比较简单是用go写的,大家可以fork出来补充自己需要的场景。

有个莫名其妙的进程我需要查一查:

先用ps aux | grep xxx 来定位进程号,有的pid之后就好说了,我们就可以用top -p pid来看下该进程的资源占用情况,用lsof -p pid来查看该进程占用的文件描述符,ll /proc/{pid}/exe 可以查看这个进程的启动目录是哪里。

怎么磁盘又快满了:

使用df 命令查看当前磁盘使用情况,执行du -sh * | sort -nr会把当前目录下的子目录大小打印出来,这样我们看出哪个目录占用测判空间比较大了。如果发现删除了一些文件后磁盘还是占用比例比较高,这时候可以用lsof | grep delete可以查看当前系统有没有删掉未释放的文件描述符,这些也可能是占用磁盘的罪魁祸首。

image

image

三、提高效率篇:

1、强烈建议大家把自己的终端打造的好看一些,这样你在敲写命令的时候视觉上就会舒服很多~有人和我一样用zsh的话,那么推荐ohmyzsh里边包含了各种各样的主题,可以给你的小黑框穿上漂亮的小裙子。

2、对于自动补全方面:zsh下是忽略大小写的,这点比较舒服,而不是遇到大写目录的时候怎么tab都tab不出来~,再就是可以安装一个叫zsh-autosuggestions的插件,该插件可以在写命令的时候将近期写过的命令以浅色的形式在后面显示出来,按→键时就会补全这个命令。

image

3、多用alias,可以大大提高命令敲写效率,它可以把一个长命令或者一个带了很多参数的命令代替成一个自定义的命令,所以大家都偏爱ll而不是ls -l。

4、在跳转目录的时候会常用cd命令,cd /etc进入系统配置目录,cd ~ 进入家目录,如果到达一个路径很长的目录下要敲写很多路径,而这个目录又是一个我们常使用的办公目录,对没错,你可以用alias进入办公目录的命令缩写成一个短的命令比如:cdwork;如果有多个这种目录那就比较麻烦了,在这里推荐一个叫autojump的命令,它可以将最近访问的目录按权重记录到一个地方,然后以模糊搜索的方式进行跳转目录,只需敲j+一部分目录名即可跳转,非常方便。

image

5、大家用mac系统,对于文件管理器通常会使用mac自带的finder来进行鼠标点点点~,推荐大家使用ranger命令,运行这个命令是会进入linux下的文件管理器,默认操作使用vim的快捷键,可完全脱离鼠标进行文件操作,这个命令最大的优点是可配置性极强,写一些复杂的操作脚本集成到ranger里,比如解压缩文件,批量删除等等等等,非常方便,建议去试一试,相信大家会爱不释手的。

image

6、fzf命令github.com/junegunn/fz…,是一个模糊搜索文件的命令,当cd到某个目录时,想要编辑这个目录下的某个文件,明确文件名却不知道具体在哪?对,是的~大家可以使用find命令进行查找,对于简单地查找一个文件这个操作,find还是有一些低效的。进入fzf模式后只需写几个关键词就可将想要搜索的文件列出来,并且fzf的特点远不止这些,可集成到vim下进行常用搜索:缓冲区的文件,近期使用的命令等等;可集成到ranger下进行模糊搜索文件;可集成到kill命令下来搜索想要关闭的进程;可替换系统的ctrl + r来搜索近期执行的命令。这些配置可在github.com/junegunn/fz…下找到。

image

结尾:

感谢大家可以阅读到这里,以上就是给大家带来的终端下的一些基本操作,希望大家可以把小黑框运用起来,能用命令完成的工作就用命令来完成,相信我这绝对比用鼠标点点点效率要高,最后配一张黑客帝国的图~希望大家以后都可以像黑客帝国里的人一样,随便敲几行命令屏幕就会炫酷的滚动起来~

image