【运维】Java开发人员掌握的Linux命令

时间:2023-01-17 12:37:37

作为Java开发人员,要掌握常用的Linux命令。

为什么要写此文,笔者的Linux很厉害?NoNoNo,正因为笔者不熟悉Linux才写此文,以作整理。

最主要的命令

查询命令的简要用法,help

当你不懂一个命令的作用时,可以在该命令后加--help或简写-h查看该命令的用法,比如查询ls的用法:

[root@localhost ~]# ls --help

查询命令的详细用法,man

manmanual,手册的意思,由于手册比较详细,会有翻页等交互,操作与less一致。

比如查询man命令的手册:

[root@localhost ~]# man man

常用选项

  • -h,也可用--human-readable,人类可读的意思
  • -f,也可用--force,强制的意思
  • -n,行数的意思,line number
  • -c,创建的意思,create
  • -x,也可用--extract,解压的意思
  • -f,也可用--file=ARCHIVE,指定归档文件的意思
  • -r,也可用--recursive,递归、循环的意思
  • -d,也可用--decompress,解压的意思
  • -v,也可用--verbose,详细的、啰嗦的意思

文件相关命令

列出目录内容,ls

lslist directory contents,列出目录内容。

[user001@localhost ~]$ ls
1.log Desktop Documents Downloads Music Pictures Public Templates Videos

另外,ls -l的别名ll也挺好用,因为ll输入起来很方便:

[user001@localhost ~]$ ll
total 36
-rw-rw-r--. 1 user001 user001 25 Mar 23 07:23 1.log
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Desktop
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Documents
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Downloads
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Music
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Pictures
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Public
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Templates
drwxr-xr-x. 2 user001 user001 4096 Nov 29 07:41 Videos

文本编辑,vi

vi,全名为vi IMproved,是很好用的文本编辑器。

  • Esc,退出编辑模式命令模式
  • i,在光标前以插入形式进入编辑模式,进入此模式后在屏幕的左下角可看到-- INSERT --
  • a,在光标后以插入形式进入编辑模式,进入此模式后在屏幕的左下角可看到-- INSERT --
  • x,删除单字符,为什么是x,我的理解是叉的意思
  • 连续的按键位置hjkl分别代表
  • j是右手食指的按键,是最常用的按键,自然是代表
  • k用无名指按的,代表
  • h在最左边,自然代表
  • l在最右边,自然代表
  • 1yy,复制当前光标下的1行,如果复制两行,就是2yy。但是,我不知道为什么yy代表复制
  • p,粘贴,paste
  • dd,删除一行,delete
  • :wq,保存并退出,write & quit
  • :q!,不保存退出

查看文档,less

查看文档。

  • f,向下翻一页文档,forward的意思
  • b,向上翻一页文档,back的意思
  • G,滚动到文档的最后,这在查看日志时很常用
  • F,滚动到文档的最后并定时刷新,这在查看日志时很常用
  • /xxx,查找xxx的文档位置,按n定位到下一个匹配项,N定位到上一个匹配项

创建目录,mkdir

mkdir,意为创建目录,make directories

[root@localhost ~]# mkdir hello_pkg
[root@localhost ~]#
[root@localhost ~]# ll
total 72
-rw-------. 1 root root 2695 Nov 29 15:36 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4096 Mar 26 21:07 hello_pkg

创建文件,touch

touch,修改文件时间,或创建文件。以下是例子:

[root@localhost hello_pkg]# ll
total 0
-rw-r--r--. 1 root root 0 Mar 26 21:11 hello_world.txt
[root@localhost hello_pkg]#
[root@localhost hello_pkg]# touch hello_world.txt
[root@localhost hello_pkg]#
[root@localhost hello_pkg]# ll
total 0
-rw-r--r--. 1 root root 0 Mar 26 21:12 hello_world.txt
[root@localhost hello_pkg]# touch hello_new_world.txt
[root@localhost hello_pkg]# ll
total 0
-rw-r--r--. 1 root root 0 Mar 26 21:13 hello_new_world.txt
-rw-r--r--. 1 root root 0 Mar 26 21:12 hello_world.txt

按文件名查找文件

在/目录下查找名称为xxx-data的文件:

find / -name xxx-data

查找文件内匹配的关键字

查找/top.log包含关键字Mem的行:

# grep 'Mem' /top.log
Mem: 1922148k total, 1783468k used, 138680k free, 180284k buffers

省略注释行和空行的方式查看配置文件

[root@blog ~]# grep -v "^#"  xxx.conf | grep -v "^$"

删除文件或文件夹,rm

rm,删除文件或文件夹,remove files or directories

这是删除一个文件,默认会询问确认是否删除:

[root@localhost hello_pkg]# rm hello_world.txt
rm: remove regular empty file `hello_world.txt'? y

这是删除目录,默认依然会询问确认,当然你可以通过强制命令取消询问,这里不介绍:

[root@localhost ~]# rm hello_pkg/
rm: cannot remove `hello_pkg/': Is a directory
[root@localhost ~]#
[root@localhost ~]# rm -r hello_pkg/
rm: descend into directory `hello_pkg'? y
rm: remove regular empty file `hello_pkg/hello_new_world.txt'? y
rm: remove directory `hello_pkg'? y

移动文件,mv

mv,移动文件,move的意思。

[root@localhost hello_package]# mv hello_world ../
[root@localhost hello_package]# ll ../
total 72
-rw-------. 1 root root 2695 Nov 29 15:36 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4096 Mar 26 21:21 hello_package
-rw-r--r--. 1 root root 0 Mar 26 21:21 hello_world

拷贝文件,cp

cp,拷贝文件,copy的意思。

[root@localhost ~]# cp hello_world ./hello_package/
[root@localhost ~]# ll hello_package/
total 0
-rw-r--r--. 1 root root 0 Mar 26 21:23 hello_world

排序,sort

对文件排序并输入。

echo -e "3\n2\n1" > 123.txt
sort 123.txt
1
2
3

排除重复,uniq

echo -e "3\n2\n2\n1" > 123.txt
uniq 123.txt
3
2
1

实践

nginx的access.log是一个Web的访问日志,用它来练习非常不错,他的内容是这样的:

127.0.0.1 - - [07/Jul/2018:12:34:53 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "curl/7.29.0"
192.168.1.1 - - [07/Jul/2018:12:50:05 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:12:50:32 +0800] "GET /index.html HTTP/1.1" 403 169 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:12:52:21 +0800] "GET /index-nick.html HTTP/1.1" 200 612 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:12:52:34 +0800] "GET /index.html HTTP/1.1" 403 169 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:12:54:21 +0800] "GET /index-nick.html HTTP/1.1" 200 612 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:12:56:03 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:20:32:56 +0800] "GET /index.html HTTP/1.1" 403 169 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:20:33:02 +0800] "GET /index-nick.html HTTP/1.1" 200 612 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:20:34:58 +0800] "GET /index.html HTTP/1.1" 403 169 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:20:35:03 +0800] "GET /index-nick.html HTTP/1.1" 403 169 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:20:40:10 +0800] "GET /index.html HTTP/1.1" 403 169 "-" "curl/7.29.0"
127.0.0.1 - - [07/Jul/2018:20:40:16 +0800] "GET /index-nick.html HTTP/1.1" 403 169 "-" "curl/7.29.0"

提取所有请求URL并排序排重

awk '{print $7}' /usr/local/nginx/logs/access.log | sort | uniq

归档文件命令

文件打包归档,tar

tar,将文件打包归档,或将存档文件打开。为什么叫tar?我的理解是together archive

[root@localhost hello_package]# tar -cf txt.tar 1.txt 2.txt
[root@localhost hello_package]# ll
total 12
-rw-r--r--. 1 root root 0 Mar 26 22:29 1.txt
-rw-r--r--. 1 root root 0 Mar 26 22:29 2.txt
-rw-r--r--. 1 root root 10240 Mar 26 22:30 txt.tar
[root@localhost hello_package]# ll
total 12
-rw-r--r--. 1 root root 10240 Mar 26 22:30 txt.tar
[root@localhost hello_package]# tar -xf txt.tar
[root@localhost hello_package]# ll
total 12
-rw-r--r--. 1 root root 0 Mar 26 22:29 1.txt
-rw-r--r--. 1 root root 0 Mar 26 22:29 2.txt
-rw-r--r--. 1 root root 10240 Mar 26 22:30 txt.tar

gz文件的解压及压缩,gzip

gunzip解压文件:

[root@localhost third_pkg]# gzip -d apache-tomcat-8.5.12.tar.gz
[root@localhost third_pkg]# ll
total 13452
-rw-r--r--. 1 root root 13772800 Mar 14 19:55 apache-tomcat-8.5.12.tar

gunzip压缩文件:

[root@localhost third_pkg]# gzip -c apache-tomcat-8.5.12.tar > apache-tomcat-8.5.12.tar.gz

xz文件的解压和压缩,xz

解压:

[root@localhost third_pkg]# xz -d rabbitmq-server-generic-unix-3.6.8.tar.xz

压缩:

[root@localhost third_pkg]# xz -k rabbitmq-server-generic-unix-3.6.8.tar

bz2的解压与压缩,bzip2

解压:

[root@localhost third_pkg]# bzip2 -d 123.tar.bz2

压缩:

[root@localhost third_pkg]# bzip2 -c 123.tar > 123.tar.bz2

系统状态的命令

查看网卡的信息,ifconfig

ifconfig,是network interfaces configuring,查询服务器的网卡情况:

[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:72:9D:E7
inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe72:9de7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4806 errors:0 dropped:0 overruns:0 frame:0
TX packets:826 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:387034 (377.9 KiB) TX bytes:138929 (135.6 KiB) lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:448 (448.0 b) TX bytes:448 (448.0 b)

查看磁盘使用情况,df

dfdisk file system的简写,用于查看磁盘的使用情况。常搭配-h使用,-h--human-readable的意思。

[user001@localhost ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 77G 3.3G 70G 5% /
tmpfs 495M 216K 495M 1% /dev/shm
/dev/sda1 291M 34M 242M 13% /boot

查看目录大小

查看当前目录的大小:du -sh

查看当前目录下各一级子目录的大小:du -lh --max-depth=1

[root@blog third_package]# du -sh
507M .
[root@blog third_package]#
[root@blog third_package]# du -lh --max-depth=1
62M ./redis-3.2.1
232K ./.deps
23M ./nginx-1.8.0
6.8M ./.libs
507M .

查看进程的信息,ps

psprocess snapshot的意思,进程快照,通过此命令可以查看进程的信息,常用的用法:

[user001@localhost ~]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Mar22 ? 00:00:01 /sbin/init
root 2 0 0 Mar22 ? 00:00:00 [kthreadd]
root 3 2 0 Mar22 ? 00:00:00 [migration/0]

查看内存使用情况,free

free查看内存使用情况:

[user001@localhost ~]$ free
total used free shared buffers cached
Mem: 1012352 537764 474588 0 72292 253348
-/+ buffers/cache: 212124 800228
Swap: 2031608 0 2031608

其中Swap交换区,类似于Windows的虚拟内存,在内存不够时,把硬盘空间当成内存使用。

虚拟内存统计报告,vmstat

vmstat,是virtual memory statistics,意思为虚拟内存统计。

[user001@localhost ~]$ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 473968 72644 253364 0 0 8 4 25 35 0 0 99 0 0

查看网络情况,netstat

[user001@localhost ~]$ netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.1.101:ssh 192.168.1.100:63840 ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 9155 @/org/kernel/udev/udevd
unix 2 [ ] DGRAM 12811 @/org/freedesktop/hal/udev_event
unix 16 [ ] DGRAM 12243 /dev/log

查看IO的情况,iostat

[user001@localhost ~]$ iostat
Linux 2.6.32-431.el6.x86_64 (localhost.localdomain) 03/23/2017 _x86_64_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle
0.05 0.00 0.29 0.24 0.00 99.41 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.78 16.18 8.62 611952 325794

网络命令

下载文件,wget

wget,从网络上下载文件.The non-interactive network downloader.

[root@localhost third_pkg]# wget http://apache.fayea.com/tomcat/tomcat-8/v8.5.12/bin/apache-tomcat-8.5.12.tar.gz

截取网络传输的数据包,tcpdump

指定eth0网卡且端口为443的数据包:

tcpdump -i eth0 port 443

指定eth0网卡且端口为443且IP为xx.xx.xx.xx的数据包:

tcpdump -i eth0 '(port 443 && host xx.xx.xx.xx)'

将截取的数据包保存为cap文件,在Windows下可用Wireshark分析:

tcpdump -i eth0 -w /tmp/mytcpdump-20170907.cap

安装软件

查询是否安装RPM包

[root@blog third_package]# rpm -qa | grep rabbitmq

安装RPM包

[root@blog third_package]# rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm

等于

[root@blog third_package]# rpm --install --verbose --hash rabbitmq-server-3.6.5-1.noarch.rpm

卸载软件

[root@blog third_package]# rpm -e erlang-common_test-R14B-04.3.el6.x86_64

卸载多版本

[root@blog third_package]# rpm -e --allmatches xxx

yum查询安装包

[root@blog third_package]# yum list | grep erlang

yum安装软件

[root@blog third_package]# yum install xxx

yum卸载软件

[root@blog third_package]# yum remove erlang

定时任务

查看当前用户的定时任务:crontab -l

编辑当前用户的定时任务:crontab -e,其会进入vi编辑具体任务,其对应的是/var/spool/cron/下的文件,比如root用户,就是/var/spool/cron/root

系统的定时任务可以配置到/etc/crontab,另外,此文件也有定时任务时间格式的简单描述。

其它

服务器时间同步

[root@blog ~]# sudo yum install ntp
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
Package ntp-4.2.6p5-10.el6.centos.2.x86_64 already installed and latest version
Nothing to do
[root@blog ~]# sudo ntpdate time.nist.gov
26 Jun 18:00:24 ntpdate[1215]: the NTP socket is in use, exiting

一些符号的用法

前面命令的输出作为后面命令的输入,|

|,前面命令的输出作为后面命令的输入,比如查看进程并筛选包含java的行:

[user001@localhost ~]$ ps -ef | grep java
user001 7729 7601 0 06:29 pts/0 00:00:00 grep java

重定向,>

>重定向,如果文件不存在,则创建文件;如果已存在,则覆盖。

[user001@localhost ~]$ echo 'user101' > 1.log

追加,>>

>>,将内容追加到文件末尾。如果文件不存在,则创建文件;如果已存在,则将内容追加在文件末尾。

[user001@localhost ~]$ echo 'user002' >> 1.log

单引号与双引号,"、""

单引号忽略所有特殊字符,双引号只忽略部分特殊字符,不忽略$、*等等等。而表达一个字符串,除了单引号与双引号,还有不加任何引号的形式,如果是不含空格的连续字符串,在命令中可以直接使用,否则可以用双引号或单引号括起来。

在命令中使用字符串,可以遵循以上规则。

在less命令阅读的文档中查找某关键字,直接使用包含空格的字符串即可。

[root@localhost ~]# echo '$PATH'
$PATH
[root@localhost ~]# echo "$PATH"
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/rabbitmq_server-3.6.6/sbin:/usr/local/erlang/bin

执行多条命令的连接符,"&&"

[root@blog /]# echo 'hello ' && echo 'world'
hello
world

脚本

强制删除关键字有关的进程

#/bin/bash

ps -ef | grep $1 | cut -c 9-15 | xargs kill -9