目录

Linux - 常用命令

旨在收集一些常用的 Linux 命令于此,方便以后快速查询及使用。其中有些命令在 CentOS 7 及以上的版本中并不能正常使用,需要安装相应的包才能工作。

命令技巧

命令帮助

  • 记得关键字的情况下,通过 man -k <command keyword> 来搜索
  • 命令简要说明使用 whatis <command>;命令详细说明使用 info <command>
  • 查看命令位置使用 which <command>
  • 命令的具体参数和使用方法使用 man <command>

Bash 快捷键

名称描述
Ctrl-U删除光标到行首的所有字符,在某些设置下,删除全行
Ctrl-W删除当前光标到前边的最近一个空格之间的字符
Ctrl-H删除光标前边的字符
Ctrl-R匹配最相近的一个文件,然后输出

系统命令

命令描述
lspci -tv列出所有 PCI 设备
lsusb -tv列出所有 USB 设备
lsmod列出加载的内核模块
uname -a查看内核,操作系统,CPU 信息
head -n 1 /etc/issue查看操作系统版本
cat /proc/cpuinfo查看 CPU 信息
grep “model name” /proc/cpuinfo | wc -l查看 CPU 数量
hostname查看计算机名
env查看环境变量
free -m查看内存使用量和交换区使用量
df -h查看各分区使用情况
grep MemTotal /proc/meminfo查看内存总量
grep MemFree /proc/meminfo查看空闲内存量
uptime查看系统运行时间,用户数,负载
cat /proc/loadavg查看系统负载
lsof -i:3306查看端口占用的进程状态
kill -9 <pid>强行中止进程
ps -ef | grep name | awk ‘{print $2}’ | xargs kill -9查询指定的进程并进行中止
ps -aux显示所有(包含其他用户)的进程
ps -ef | grep name查看指定进程
ps -x -o pid,rss,vsz,command查看进程占用内存信息

磁盘命令

命令描述
mount输出系统目前的挂载信息
mount /dev/sda1 /mnt将 sda1 挂载到 /mnt 中
mount | column -t查看挂接的分区状态
umount /mnt卸载 /mnt 这个挂载点的文件系统
umount -a卸载所有已挂载的文件系统
fdisk -l查看所有分区
swapon -s查看所有交换分区
dmesg | grep IDE查看启动时 IDE 设备检测状况
iptables -L查看防火墙设置
du -sh <directory>查看指定目录的大小
du -sh ls | sort查看当前目录下所有子文件夹排序后的大小

网络命令

命令描述
ifconfig查看所有网络接口的属性
ip addr show查看所有网络接口的属性
route -n查看路由表
netstat -lntp查看所有监听的端口
netstat -antp查看所有已经建立的连接
netstat -s查看网络统计信息
netstat -nap | grep 将会显示使用该端口的应用程序的进程 ID
netstat -allnetstat -a将会显示包括 TCP 和 UDP 的所有连接
netstat --tcpnetstat -t将会显示 TCP 连接
netstat --udpnetstat -u将会显示 UDP 连接
netstat -g将会显示该主机订阅的所有多播网络
netstat -anpt | grep ‘:找出运行在指定端口的进程
netstat -anawk ‘/^tcp/{+S[$NF]} END {for(a in S) print a,S[a]}’
ping -c 3 <domain>指定次数后 Ping 域名

curl

  • cURL 是一个利用 URL 语法在命令行下工作的文件传输工具。
  • cURL 支持的通信协议有:FTPFTPSHTTPHTTPSTFTPSFTPGopherSCPTelnetDICTFILELDAPLDAPSIMAPPOP3SMTPRTSP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 查询 curl 支持的协议
curl-config --protocols

# 将文件保存为指定的文件中
curl -o google.html https://google.com/

# 使用 URL 中默认的文件名保存文件到本地
curl -O https://google.com/

# 多个文件下载保存
curl -o a.html https://a.com/a.html -o b.html https://b.com/b.html
curl -O https://a.co/a.html -O https://b.com/b.html

# 下载 golang 安装包
curl -fsSL https://golang.google.cn/dl/go1.21.3.linux-amd64.tar.gz -o go1.21.3.linux-amd64.tar.gz

# 有的网址是自动跳转的,使用 -L 参数,curl 就会跳转到新的网址
curl -L http://www.g.cn

# 断点续传
curl -O http://www.gnu.org/software/gettext/manual/gettext.html
curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html

# 限制数据传输速率
curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html

# 下载给定日期时间之前修改的文件
curl -z -06-Nov-15 https://a.com/a.html

# 下载给定日期时间之后修改的文件
curl -z 06-Nov-15 https://b.com/b.html

# 通过 HTTP 认证
curl --user username:password https://a.com/test

# 从 FTP 服务器下载文件
curl -u ftpuser:ftppass -O ftp://domain/public/xxx.php

# 使用范围查看和下载
curl ftp://ftp.domain.com/test/[a-z]/

# 上传单个文件
curl -u ftpuser:ftppass -T file.txt ftp://domain

# 上传多个文件
curl -u ftpuser:ftppass -T "{file1,file2}" ftp://domain

# 保存标准输入到远程服务器指定文件中
curl -u ftpuser:ftppass -T - ftp://domain/test.txt

# -v 显示通信过程,包括端口连接和 http request 头信息
curl -v https://www.baidu.com

# --trace 将通信过程保存到指定文件
curl --trace a.txt https://a.com/

# 使用代理下载文件
curl -x proxysever.test.com:8081 https://www.google.com/

wget

The Ultimate Wget Download Guide With 15 Awesome Examples

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 下载单个文件
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

# 下载文件重命名
wget -O baidu.html http://www.baidu.com/index.html

# 限制下载速率
wget --limit-rate=200k http://www.openss7.org/repos/tarballs/strx25-0.9.2.1.tar.bz2

# 断点续传
wget -c http://www.openss7.org/repos/tarballs/strx25-0.9.2.1.tar.bz2

#  后台下载
wget -b http://www.openss7.org/repos/tarballs/strx25-0.9.2.1.tar.bz2

# 查看下载进度
tail -f wget-log

scp

1
2
3
4
5
// 本地文件复制到远程服务器
$ scp -r test.sql user@ip:/home/user

// 远程服务器文件复制到本地
$ scp -r user@ip:/home/user/test.sql ./

用户命令

命令描述
w查看活动用户
id <username>查看指定用户信息
last查看用户登录日志
cut -d: -f1 /etc/passwd查看系统所有用户
cut -d: -f1 /etc/group查看系统所有组
crontab -l查看当前用户的计划任务

文件命令

命令描述
ln source dest为 source 创建一个名为 dest 的硬链接
ln -s source dest为 source 创建一个名为 dest 的软链接
tar -cvf filename.tar .将当前目录所有文件归档,但不压缩
tar -xvf filename.tar解压 filename.tar 到当前文件夹
tar -cvjf filename.tar.bz2 .使用 bzip2 压缩当前目录
tar -xvjf filename.tar.bz2解压 filename.tar.bz2 到当前目录
tar -cvzf filename.tar.gz .使用 gzip 压缩当前目录
tar -xvzf filename.tar.gz解压 filename.tar.gz 到当前文件夹
tar -tf filename只查看 filename 归档中的文件,不解压
chown user filename改变 filename 的所有者为 user
chown user:group filename改变 filename 的所有者为 user,组为 group
chown -R root folder改变 folder 文件夹及其子文件的所有者为 root
chmod +x filename为 user,group,other 添加执行权限
chmod -x filename取消 user,group,other 的执行权限
chmod +w filename为 user 添加写入权限
chmod ugo=rwx filename设置 user,group,other 具有读取、写入、执行权限
chmod ug=rw filename设置 user,group 添加读取、写入权限
chmod ugo=--- filename取消所有权限
find . -name <pattern>从当前目录查找符合 pattern 的文件
find <directory> -name PATTERN -exec ls -l {} \;从指定文件查找所有符合 pattern 的文件,并交由 ls 输出详细信息
find ./ -name "*.txt" -exec rm {} \;递归当前目录及子目录删除所有 .txt 文件
find . \( -name "*.txt" -o -name "*.pdf" \) -print在当前目录下递归查找 .txt 和 .pdf 文件
find . -type d -print递归列出当前目录下的所有目录
find . -type f -size +5k查找大于指定大小的文件
find . -type f -name “*.php” -print0 | xargs -0 wc -l统计指定目录下的程序行数
locate php.ini更快的查询指定的文件,需要定期执行更新命令 updatedb 来更新索引库
grep -r "string" /home/user/以递归方式在指定的文件中搜索给定的字符串
grep -i "the" /home/user/.zshrc在指定的文件中搜索给定的字符串
grep "Controller" . -R -n在多级目录中对指定的文本递归搜索
diff -w ~/a.txt ~/b.txt忽略空白后比较两个文件的差异

sed

1
2
3
4
5
// 将 a.txt 文件中的 php 字符串替换成 javascript 字符串
$ sed -i "s/php/javascript/g" `grep php -rl ./a.txt`

// 以相反的顺序打印文件内容
$ sed -n '1!G;h;$p' /home/user/.zshrc

awk

AWK 程序设计语言

命令描述
$0当前记录(这个变量中存放着整个行的内容)
$1-$n当前记录的第 n 个字段,字段间由 FS 分隔
FS输入字段分隔符,默认是空格或 Tab
NF当前记录中的字段个数,就是有多少列
NR已经读出的记录数,就是行号,从 1 开始,如果有多个文件话,这个值也是不断累加中
FNR当前记录数,与 NR 不同的是,这个值会是各个文件自己的行号
RS输入的记录分隔符,默认为换行符
OFS输出字段分隔符,默认为空格
ORS输出的记录分隔符,默认为换行符
FILENAME当前输入文件的名字
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// 移除指定文件中重复的行并显示出来
$ awk '!($0 in array) { array[$0]; print }' a.txt

// 将 uid 和 gid 相同的行显示出来
$ awk -F ':' '$3==$4' /etc/passwd

// 准备要操作的数据
$ netstat -atlnpe > netstat.log

// 输出三列(1,4,9)
$ awk '{print $1, $4, $9}' netstat.log

// 格式化输出
$ awk '{printf "%-8s %-8s %-8s %-25s %-25s %-15s\n",$1,$2,$3,$4,$5,$6}' netstat.log

// 仅显示第 3 列的值为 0 &&6 列的值为 LISTE
$ awk '$3==0 && $6=="LISTEN"' netstat.log

// 仅显示第 3 列的值为 0 &&6 列的值为 LISTE, 同时把表头也显示出来
$ awk '$3==0 && $6=="LISTEN" || NR==2' netstat.log

// 仅显示第 3 列的值为 0 &&6 列的值为 LISTE, 同时把表头也显示出来, 并且格式化输出三列(4, 5, 6)
$ awk '$3==0 && $6=="LISTEN" || NR==2 {printf "%-20s %-20s %s\n", $4 , $5, $6}' netstat.log

// 仅显示第 3 列的值为 0 &&6 列的值为 ESTABLISHED, 同时把表头也显示出来, 并且格式化输出三列(4, 5, 6)
$ awk '$3==0 && $6=="ESTABLISHED" || NR==2 {printf "%02s %s %-20s %-20s %s\n", NR, FNR, $4, $5, $6}' netstat.log

// 指定分隔符
$ awk 'BEGIN{FS=":"} {print $1, $3, $6}' /etc/passwd
或者
$ awk -F: '{print $1, $3, $6}' /etc/passwd

// -t 作为分隔符
$ awk -F: '{print $1, $3, $6}' OFS="\t" /etc/passwd

// 匹配 LISTEN
$ awk '$6 ~ /LISTEN/ || NR==2 {print NR, $4, $5, $6}' OFS="\t" netstat.log
或者
$ awk '/LISTEN/' netstat.log

// 匹配 ESTABLISHED
$ awk '$6 ~ /ESTABLISHED/ || NR==2 {print NR, $4, $5, $6}' OFS="\t" netstat.log

// 匹配 ESTABLISHED 取反
$ awk '$6 !~ /ESTABLISHED/ || NR==2 {print NR, $4, $5, $6}' OFS="\t" netstat.log
或者
$ awk '!/ESTABLISHED/' netstat.log

// 拆分文件
$ awk 'NR!=1 && NR!=2 {print > $6}' netstat.log

// 判断匹配拆分文件
$ awk 'NR!=1 { if ($6 ~ /TIME|ESTABLISHED/) print > "1.log"; else if ($6 ~ /LISTEN/) print > "2.log"; else print > "3.log" }' netstat.log

// 求 *.php *.js 文件大小总和
$ ls -l *.php *.js | awk '{sum+=$5} END {print sum}'

// 统计每个用户的进程的占了多少内存
$ ps aux | awk 'NR!=1 {a[$1]+=$6;} END { for(i in a) print i ": " a[i]" KB"; }'

// 从文件中找出长度大于 80 的行
$ awk 'length>80' /etc/php.ini

// 按连接数查看客户端 IP
$ netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr

// 打印九九乘法表
$ seq 9 | sed 'H;g' | awk -v RS='' '{ for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t") }'

wc

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// 统计一个文件的行数,字数,字节数,文件名称
$ wc filename

// 统计一个文件的字符数
$ wc -c filename

// 统计一个文件的字符数
$ wc -m filename

// 统计一个文件的行数
$ wc -l filename

// 统计一个文件的单词数
$ wc -w filename

// 统计目录下的文件个数
$ ll <directory> | wc -l

date

FormatDescription
%D显示日期为月日年 (mm/dd/yy)
%d显示天的日期 (01~31)
%a显示周的缩写名称 (Sun~Sat)
%A显示周的全部名称 (Sunday~Saturday)
%h显示月份的缩写名称 (Jan~Dec)
%b显示月份的缩写名称 (Jan~Dec)
%B显示完整的月份名称 (January~December)
%y显示年份的最后两位 (00~99)
%Y显示完整的年份名称
%T显示时间以 24 小时格式的 HH:MM:SS
%H显示小时 (00~23)
%M显示分钟 (00~59)
%S显示秒数 (00~59)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// 显示系统本地日期时间
$ date
Thu Jul 14 13:46:13 CST 2022
$ date +%c
Thu 14 Jul 2022 02:10:31 PM CST

// 显示系统 UTC 日期时间
$ date -u
Thu Jul 14 05:46:41 UTC 2022
$ date -u +%Y-%m-%dT%H:%M:%SZ
2022-07-14T06:10:11Z

// 以日期时间格式显示给定的日期字符串
$ date --date="2/02/2012"
Thu Feb  2 00:00:00 CST 2012
$ date --date="12/12/2022T12:30:30"
Mon Dec 12 13:30:30 CST 2022
$ date --date="Feb 2 2022 12"
Wed Feb  2 12:00:00 CST 2022

// 显示过去的日期
$ date --date="2 year ago"
Tue Jul 14 13:51:32 CST 2020
$ date --date="10 day ago"
Mon Jul  4 13:52:45 CST 2022
$ date --date="5 min ago"
Thu Jul 14 13:46:46 CST 2022
$ date --date="5 sec ago"
Thu Jul 14 13:51:46 CST 2022
$ date --date="yesterday"
Wed Jul 13 13:52:20 CST 2022

// 显示未来的日期
$ date --date="next tue"
Tue Jul 19 00:00:00 CST 2022
$ date --date="2 day"
Sat Jul 16 13:53:31 CST 2022
$ date --date="10 sec"
Thu Jul 14 13:53:46 CST 2022
$ date --date="next year"
Fri Jul 14 13:53:46 CST 2023
$ date --date="tomorrow"
Fri Jul 15 13:54:21 CST 2022

// 格式化显示
$ date '+%D'
07/14/22
$ date '+%D %T'
07/14/22 14:05:59
$ date '+%Y-%m-%d %H:%M:%S'
2022-07-14 14:06:23
$ date '+%A %B %d %T %Y'
Thursday July 14 14:06:45 2022

// 显示当前日期的时间戳
$ date +%s
1657779074

// 显示文件的最后修改时间
$ date -r /etc/hosts
Fri Jun 11 23:13:54 CST 2021

// 显示自定义输出
$ date +"Week: %V; Year: %Y"
Week: 28; Year: 2022

// 将时间戳转换为日期时间格式
$ date -d @`date +%s`
Thu Jul 14 14:16:38 CST 2022
$ date +'%Y-%m-%d %H:%M:%S' -d @`date +%s`
2022-07-14 14:17:53