Jinyun's Notes

没什么天赋,爱好也不多,但愿坚持做些喜欢的事情

0%

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查看系统负载
kill -9 <pid>强行中止进程
ps -ef | grep查找指定的进程
ps -aux显示所有(包含其他用户)的进程
lsof -i:3306查看端口占用的进程状态

磁盘命令

命令描述
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 域名
lsof -i:<port>查看某个端口是否被占用

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
// 下载单个文件
$ 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

本篇内容会持续更新

本笔记是笔者在学习和工作中的一些整理,如对您有用,请鼓励我继续写作