Linux:必不可少的基础命令和工具。
grep
grep是Linux下通用的文本内容查找命令,可以利用他打印匹配的上下几行。在线上查找问题时可以使用下列命令查找关键字,显示关键字所在行的前后多行,并且给关键字着色。
使用方式
- grep -5 'pattern' INPUT_FILE # 打印匹配行的前后5行
- grep -C 5 'pattern' INPUT_FILE # 打印匹配行的前后5行
- grep -A 5 'pattern' INPUT_FILE # 打印匹配行的后5行
- grep -B 5 'pattern' INPUT_FILE # 打印匹配行的前5行
- grep -A -15 --color 1010061938 * # 查找后着色
find
通过文件名查找文件的所在位置,文件名查找支持模糊匹配。
使用方式
- find . -name FILE_NAME
命令输出
uptime
查看机器的启动时间、登录用户、平均负载等情况,通常用于在线上应急或者技术攻关中确定操作系统的重启时间。
使用方式
- uptime
命令输出
从上面的输出可以看到如下信息。
- 当前时间:14:42:30。
- 系统已运行的时间:2小时51分。
- 当前在线用户:3个用户。
- 系统平均负载:0.03,0.06,0.06,为最近1分钟、5分钟、15分钟的系统负载情况。
系统的平均负载是指在特定的时间间隔内队列中运行的平均进程数。如果一个进程满足以下条件,他就会位于运行队列中。
- 他没有在等待I/O操作的结果。
- 他没有主动进入等待状态(也就是没有调用'wait'相关的系统API)。
- 没有被停止(例如:等待终止)。
一般来说,每个CPU内核对应的活动进程数不大于3时,系统运行良好,也就是说活动进程数小于CPU核心数的3倍。
例如,如果服务器的CPU有3个核心,那么只要uptime最后输出的一串字符数值小于9,就表示系统负载正常。但是,如果系统负载超过10,就表明当前系统的负载过重,需要定位系统执行任务负载超标的原因。
lsof
lsof用于列出系统当前打开的文件句柄,在Linux文件系统中任何资源都是以文件句柄的形式进行管理的,例如:硬件设备、文件、网络套接字等,系统内部为每一种资源分配一个句柄,应用程序只能用操作系统分配的句柄来引用资源,因此,文件句柄为应用程序与基础操作系统之间的交互提供了通用的操作接口。
应用程序打开文件的描述符列表包含了大量的关于应用程序本身的运行信息,因此通过lsof工具可查看这个文件句柄列表,对系统监控及应急排错提供重要的帮助。
查看某个进程打开的文件句柄
- lsof -p 2862
命令输出
查看某个端口的使用方式
- lsof -i:8080
命令输出
ulimit
Linux系统对每个登录的用户都限制其最大进程数和打开的最大文件句柄数。为了提高性能,可以根据硬件资源的具体情况设置各个用户的最大进程数和打开的最大文件句柄数。可以用ulimit -a 来显示当前的各种系统对用户使用资源的限制:
设置用户的最大进程数
- ulimit -u 1024
设置用户可以打开的最大文件句柄数
- ulimit - n 65530
curl
我们在开发程序后使用Junit、Testng及Jmock、Mockito进行单元测试,单元测试后需要进行集成测试,由于当前的线上服务较多的使用了RESTful风格的API,所以集成测试时就需要进行HTTP调用,查看返回的结果是否符合预期,curl命令当然是首选的测试方法。
使用方式
- curl -i "http://www.sina.com" # 打印请求响应头信息
- curl -v "http://www.sina.com" # 打印更多的调试信息
- curl -verbose "http://www.sina.com" 打印更多的调试信息
- curl -d 'abc=def' "http://www.sina.com" # 使用POST方法提交HTTP请求
- curl -I "http://www.sina.com" # 仅仅返回HTTP头
- curl -sw '%{http_code}' "http://www.sina.com" # 打印HTTP响应码
scp
scp命令是Linux系统中功能强大的文件传输命令,可以实现从本地到远程,以及从远程到本地的双向文件传输,用起来非常方便,常用来在线上定位问题时将线上的一些文件下载到本地进行详查,或者将本地的修改上传到服务器上。
使用方式
- scp [email protected]:/home/robert/test.txt .
- scp ./test.txt [email protected]:/home/robert/
vi和vim
vi和vim是Linux中最常用的命令行文本编辑工具,vim是vi的升级版本,在某些Linux版本下,vi实际上通过软连接指向vim。
常用的vi、vim命令
- h:左移一个字符。
- l:右移一个字符,这个命令很少用,一般用w代替。
- k:上移一个字符。
- j:下移一个字符。
- set number:显示行号。
- shift+g:移动到最后一行。
- l+shift+g:移动到第1行。
- n+shift+g:移动到第n行。
- 0:移动到行首。
- $:移动到行尾。
- /text:查找text,按n键查找下一个,按N键查找前一个。
- ?text:查找text,反向查找,按n键查找下一个,按N键查找前一个。
- i:在当前位置前插入。
- I:在当前行首插入。
- a:在当前位置后插入。
- A:在当前行尾插入。
- o:在当前行尾之后插入一行。
- O:在当前行之前插入一行。
- %s/old/new/g:将old替换成new,替换当前行的所有匹配。
- ctrl + f:向下滚动一屏。
- ctrl + b:向上滚动一屏。
- u:撤销。
- U:撤销对整个行的操作。
- Ctrl+r:重做,即该撤销的撤销。
- x:删除当前字符。
- dd:删除当前行。
- 10d:删除从当前行开始的10行。
- yy:复制当前行。
- p:在当前光标后粘贴,如果之前使用了yy命令来复制某一行,那么在当前行的下一行进行黏贴。
- :wq:保存并退出。
- :q!:强制退出并忽略所有更改。
有了这些命令后,就基本上可以在Linux系统的终端下做开发了,无论是开发脚本,还是在Linux系统中做编辑,都没有问题。
dos2unix和unix2dos
用于转换Windows和UNIX的换行符,通常在Windows系统下开发的脚本和配置,上传UNIX系统下都需要转换。
使用方式
- [email protected]: ~$ dos2unix test.txt
- dos2unix: converting file test.txt to Unix format ...
- [email protected]: ~$ unix2dos test.txt
- unix2dos: converting file test.txt to DOS format ...
awk
awk是Linux系统下强大的文本分析工具,相对于grep的查找、sed的编辑,awk在对数据分析并生成报告时,显得尤为强大。他把文件逐行读入,以空格为默认分隔符将每行切片,也可以以任何字符为分隔符,把切开的部分进行各种分析和处理,在分析和处理的过程中支持脚本式的编程。
例如,我们对Tomcat的Access文件进行分析,得出各种HTTP响应码的数量。
Tomcat的Access文件如下:
统计结果
我们看间返回代码为200的请求有9个。
其他
下面的命令在做日常开发工作时,使用率也比较高。
- sed:文本编辑和替换。
- tr:字符替换。
- cut:选取命令,分析一段数据并取出我们想要的部分。
- wc:统计字数和行数等。
- sort:排序。
- uniq:去重或者分组统计。
- zip:压缩成zip格式的压缩包或者解压。
- tar:创建或者解压tar格式的包。