一些常用的 linux
命令整理,方便查阅
参考书籍:《大型分布式网站架构设计与实践》
more
more 文件内容或输出查看工具
# -n一次显示的行数
# +n从笫n行开始显示
more -10 access.log
# 交互命令
Enter #向下n行,需要定义。默认为1行
ctrl+f | Space #向下滚动一屏
ctrl+b | b #返回上一屏
= #输出当前行的行号
:f #输出文件名和当前行的行号
V #调用vi编辑器
!command #调用Shell,并执行命令
q #退出more
less
less 查看文件内容(比more更强大,推荐使用)
# -f强迫打开特殊文件,例如外围设备代号、目录和二进制文件
# -i忽略搜索时的大小写
# -m显示类似more命令的百分比
# -N显示每行的行号
# -s显示连续空行为一行
less -10 access.log
# 交互命令
/字符串 #向下搜索“字符串”的功能
?字符串 #向上搜索“字符串”的功能
n #重复前一个搜索(与 / 或 ? 有关)
N #反向重复前一个搜索(与 / 或 ? 有关)
b #向后翻一页
h #显示帮助界面
q #退出less 命令
head
head 显示档案的开头至标准输出中,默认前10行
# -v显示文件名
# -c<字节数>显示字节数
# -n<行数>显示行数
head -n 10 access.log
head -c 1024 access.log
tail
tail 主要用于显示指定文件末尾内容,常用查看日志文件
# -f循环读取
# -v显示文件名
# -c<字节数>显示字节数
# -n<行数>显示行数
tail -f access.log
free
free 内存使用情况
# -b、-k、-m分别以b、kb、mb为单位显示内存使用情况
# -s <秒数>每个n秒显示一次内存使用情况
free -m -s 3
total used free shared buffers cached
Mem: 1877 1724 153 89 204 725
-/+ buffers/cache: 794 1083
Swap: 0 0 0
# total内存总共的大小
# used已使用的内存大小
# free可使用的内存大小
# shared多个进程共享的内存大小
# buffers缓冲区大小
# cached缓存的大小
# linux的内存管理机制与Windows有所不同,其中有一个思想便是内存利用率最大化
# 内核会将剩余的内存申请为cached,而cached不属于free范畴
# 所以当系统运行时间较长或有频繁文件读/写的系统,cached缓存就会比较大
# 但是,free内存小并不代表可用的内存小,当程序需要申请更大的内存
# 如果free内存不够,系统会将部分cached或buffers内存回收
# 所以linux可用于分配的内存不仅仅只有free的内存
# 见第三行,即-+那行,used=used-buffers-cached,free=free+buffers+cached
# 对于应用来说,更值得关注的应该是虚拟内存swap的消耗
# swap内存使用过多,表示物理内存已经不够了
# 操作系统将本应该物理内存存储的一部分内存页调度到磁盘上
# 以为腾出足够的空间给当前的进程使用
# 当其他进程需要运行时,再从磁盘将内存的页调度到物理内存中
# 而这个调度过程,则会产生 swap I/O
# 如果 swap I/O较为频繁,将严重影响系统性能
vmstat swap I/O
vmstat查看 swap I/O
# 每2秒采样1次,一共采样3次
vmstat 2 3
# 返回值
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 147096 209480 743000 0 0 1 10 1 0 1 0 99 0 0
# si表示每秒从磁盘交换到内存的数据量(KB/s)
# so表示每秒从内存交换到磁盘的数据量(KB/s)
df
df 显示磁盘使用情况
# -a|-all 包含全部的文件系统
# -h|-human-readable 以可读性较高的方式来显示信息
df -ah
du
du 查看当前目录的使用情况
# -a|-all 包含全部的文件系统
# -h|-human-readable 以可读性较高的方式来显示信息
# -s|–summarize 仅显示总计,只列出最后加总的值。
# -d<递归深度>
du -ah
du -sh
du -d 1 -h
watch
watch 检测一个命令的运行结果
# -n <秒数>每隔n秒运行命令(默认2秒)
# -d 高亮显示变化区域
watch -n 1 -d php test.php
wc
(word count)统计指定文件或标准输入的行数、字数、字节数等
# -c filename 显示一个文件的字节数
# -m filename 显示一个文件的字符数
# -l filename 显示一个文件的行数
# -L filename 显示一个文件中的最长行的长度
# -w filename 显示一个文件的字数
wc test.php #不加参数默认显示 行数、字数、字节数
ls -l | wc -l #统计目录下的文件数量
sort
sort 文本排序命令
# -n 按数值大小排序
# -t 指定分隔符,没有指定时,以空白作为分隔符
# -k 排序字段 如: -k1 (按第1个字段排序) -k 1.2, 3.4 (按从第1个字段的第2个字符起,到第3个字段第4个字符止,进行排序)
# -b 忽略每行开始的空格
# -o 结果输出文件
# -r 以相反顺序排序
# -m 合并已经有序的文件,不排序
# -f 忽略大小写
# -d 排序时只按字母、数字或空格,忽略其它字符
# -u 去除重复的行
# -c 检查文件是否已经按照顺序排序
# -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符
# -M 将前面3个字母依照月份的缩写进行排序
sort test.php
uniq
uniq 输出或者忽略文件中的重复行
# -u 去掉所有的重复行(不加此参数,默认去掉连续的重复行)
# -c 去重复,并计算连续行出现的次数
# -d 只显示重复的行
# -i 忽略大小写
# -s=n 跳过前面n个字符不比较
# -w=n 指定每行要比较的前n个字符数
# --help 显示帮助信息
# --version 显示版本信息
uniq b.php
sort b.php | uniq -c
grep
grep 一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来
# -a不要忽略二进制数据。
# -b显示符合范本样式的那一行,以及字符偏移量。
# -c计算符合范本样式的行数。
# -<行数>显示匹配到的内容以及其上下n行。
# -i忽略字符大小写的差别。
# -n在显示符合样式的那一行之前,标示出该行的列数编号
# -v<排除内容>显示不包含匹配文本的所有行
# -V显示版本信息。
# -r递归查找。
ps aux | grep php | grep -v grep
grep -i "hello world" test.php
curl
curl 综合传输工具
# GET请求
curl http://www.fengfengphp.com
# 显示HTTP头,不显示内容
curl -I http://www.fengfengphp.com
# 同时显示HTTP头和内容
curl -i http://www.fengfengphp.com
# 将返回结果保存到文件
curl -o save.txt http://www.fengfengphp.com
curl http://www.fengfengphp.com > save.txt
# -L跟随链接重定向 http://www.fengfengphp.com -> http://wp.fengfengphp.com
curl -L http://www.fengfengphp.com
# -H 自定义 header
curl -H "Referer:www.fengfengphp.com" -H "Cookie: JSESSIONID=D0112A5063D938586B659EF8F939BE24" http://www.fengfengphp.com
# 保存cookie
curl -c "cookie.txt" http://www.fengfengphp.com
# 读取cookie
curl -b "cookie.txt" http://www.fengfengphp.com
curl -b "JSESSIONID=D0112A5063D938586B659EF8F939BE24" http://www.fengfengphp.com
# 发送POST请求
curl -d "name=zhangsan&password=123456" -X POST http://www.fengfengphp.com
curl -d "{"name":"haha"}" -X POST http://www.fengfengphp.com
# 文件上传
curl -F "param1=xxx¶m2=xxx" -F "filename=@file.tar.gz" http://www.fengfengphp.com
cut
cut 从文件或标准输入剪切内容输出到标准输出
# -b以字节为单位进行分割,对于多字节字符会将其拆分,直接忽略多字节字符的边界标志,除非指定了-n选项
# -c以字符为单位进行分割
# -d自定义分隔符,默认为制表符
# -f与-d选项一起使用,指定显示哪个区域
# -n取消分割多字节字符,该选项只和-b选项一起使用
# 输出每一行的第3个字符(ANSII字符,一个字符就是一个字节)
ps aux | grep php | cut -b 3
# 输出1-3个字符以及第8个字符,省略写法:-3表示1-3 3-表示3到行末
ps aux | grep php | cut -b 1-3,8
# 这里使用-b -c都可以,但是如果是中文的吧,只能使用-c
ps aux | grep php | cut -c 3
# 以域定位,指定分隔符为":",指定显示第一段区域
# _fpsd:*:265:265:FPS Daemon:/var/db/fpsd:/usr/bin/false
# _timed:*:266:266:Time Sync Daemon:/var/db/timed:/usr/bin/false
tail /etc/passwd | cut -d : -f 1-2
awk
awk 样式扫描和处理语言
# 打印第2列,默认分隔符为空格或制表符
ps aux | grep php | awk '{print $2}'
# cut中的/etc/password那段也能使用awk
tail /etc/passwd | cut -d ":" -f 1
tail /etc/passwd | awk -F ":" '{print $1}'
# 显示多列,以制表符分隔
tail /etc/passwd | awk -F":" '{print $1"\t"$2}'
# $0表示整行显示,$NF表示最后一行,NF表示分隔后一共几列,可以用减1表示最后第2列,NR表示行号
tail /etc/passwd | awk -F":" '{print $0}'
tail /etc/passwd | awk -F":" '{print $NF}'
tail /etc/passwd | awk -F":" '{print NF}'
tail /etc/passwd | awk -F":" '{print $(NF-1)}'
tail /etc/passwd | awk -F":" '{print NR $1}'
# 输出多列以及自定义字符串
tail /etc/passwd | awk -F":" '{print $1,$2" "$3"以及"$4}'
# BEGIN在处理指定的文本之前,先执行BEGIN模式中指定的动作
tail /etc/passwd | awk -F":" 'BEGIN {print "第一列","第二列"} {print $1,$2}'
# END在处理指定的文本之后,再执行END模式中指定的动作
tail /etc/passwd | awk -F":" 'BEGIN {print "第一列","第二列"} {print $1,$2} END {print "total1","total2"}'
# 条件判断,输出第5行整行,$0可以省略
tail /etc/passwd | awk -F ":" 'NR == 5 {print}'
# 还有很多变量 如:RS、OFS、ORS等
# 可以使用函数 如:toupper()、tolower()、length()、substr()、substr($1,2)、substr($1,2,3)、sin()、cos()、sqrt()、rand()等
tail /etc/passwd | awk -F":" 'NR == 1 {print toupper($1)}'
# 条件 如:==、>、%等 也可以正则 /string/
tail /etc/passwd | awk -F ":" '/_datadetectors/ {print $0}'
tail /etc/passwd | awk -F ":" '$1=="_datadetectors" {print $0}'
tail /etc/passwd | awk -F ":" '{if($1 == "_datadetectors") print $0;else print "nothing"}'
sed
sed 一种流编辑器
sed [option] [action]
# option
# -n使用安静(silent)模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到终端上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来
# -e直接在命令列模式上进行sed的动作编辑
# -f直接将sed的动作写在一个文件内,-f filename 则可以运行filename内的sed动作
# -rsed的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
# -i直接修改读取的文件内容,而不是输出到终端。
# function 一般function的前面会有一个地址的限制,例如:[地址]function,表示我们的动作要操作的行
# a新增行,a的后面可以是字串,而这些字串会在新的一行出现(目前的下一行)
# c取代行,c的后面可以接字串,这些字串可以取代n1,n2之间的行
# d删除行,因为是删除,所以d后面通常不接任何参数,直接删除地址表示的行
# i插入行,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
# p列印,亦即将某个选择的数据印出。通常p会与参数 sed -n 一起运行
# s替换,可以直接进行替换的工作,通常这个s的动作可以搭配正规表示法,例如 1,20s/old/new/g 一般是替换符合条件的字符串而不是整行
# =显示文件行号
# 显示文件的行号
sed '=' test.php
# 删除1-3行数据
sed '1,3d' test.php
# $表示最后一行,删除第2行到最后一行数据
sed '2,$d' test.php
# 删除第2行数据
sed '2d' test.php
# 正则匹配,删除以echo开头的行
sed '/^echo/d' test.php
# 在第1行后面增加数据hello world
sed '1a hello world' test.php
# 在第1行前面增加数据hello world
sed '1i hello world' test.php
# 把第1行替换成hello world
sed '1c hello world' test.php
# d a i c 都可以多行操作,以及使用正则
# 替换指定字符串 s/待替换字符串/新字符串/g g表示贪婪模式 /分隔符不是一定的,也可以使用其它分隔符,如:#
sed 's/555/五五五/g' test.php
sed 's#555#五五五#g' test.php
# 限制行数进行替换
sed '2,$s/555/五五五/g' test.php
# 只对数据开头的行进行替换
sed '/^[0-9]/s/555/五五五/g' test.php
# 搜索符合条件的行,安静输出(只输出第2行)
sed -n '2p' test.php
# -i直接修改读取的文件内容,而不是输出到终端。
sed -i '1d' test.php
expr
expr 四则运算和字符串操作
# 加、减、乘、除操作,乘号需要转义,运算符左右需要空格
expr 10 + 10
expr 10 - 10
expr 10 / 10
expr 10 \* 10
# 计算字符串长度 11
expr length "hello world"
# 截取字符串 索引从1开始 hello
expr substr "hello world" 1 5
# 获取首次出现的索引位置 5
expr index "hello world" o
tr
tr(translate)命令用于转换或删除文件中的字符
# tr [-cdst][--help][--version][第一字符集][第二字符集]
# -c反选设定字符。也就是符合SET1的部份不做处理,不符合的剩余部份才进行转换
# -d删除指令字符
# -s缩减连续重复的字符成指定的单个字符
# -t削减SET1指定范围,使之与SET2设定长度相等
# --help显示程序用法信息
# --version显示程序本身的版本信息
# 转换成大写
cat test.php | tr a-z A-Z
# 合并换行
cat test.php | tr "\n" " "
# 将连续重复的字符替换成单个 如:echo "5555"; -> echo "5";
cat test.php | tr -s 5
# 删除指定的字符
cat test.php | tr -d '[0-9]'
# 除了5和换行不被替换,其他全部替换成0
cat test.php | tr -c "5\n" 0
sar
sar可以监控很多信息,这里只讲sar监控网络流量信息
# 安装sar
yum install sysstat
# -n 汇报网络状况
# DEV显示网络接口信息
# EDEV显示关于网络错误的统计数据
# NFS统计活动的NFS客户端的信息
# NFSD统计NFS服务器的信息
# SOCK显示套接字信息
# ALL显示所有5个开关
sar -n { DEV | EDEV | NFS | NFSD | SOCK | ALL }
# 第一个 1 表示每秒抽样一次
# 第二个 1 表示总共抽取一次
sar -n DEV 1 1
# 返回结果
03:35:00 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
03:35:01 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
03:35:01 PM eth0 3.06 1.02 0.19 0.23 0.00 0.00 0.00
Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: eth0 3.06 1.02 0.19 0.23 0.00 0.00 0.00
# lo表示本地回环网络
# eth0表示的是网卡
# rxpck/s表示每秒接收的数据包数量
# txpck/s表示每秒发出的数据包数量
# rxKB/s表示每秒接收到的字节数(KB)
# txKB/s表示每秒发送的字节数(KB)
# rxcmp/s表示每秒收到的压缩包数量
# txcmp/s表示每秒发送的压缩包数量
# rxmcst/s表示每秒收到的广播包数量
iostat
iostat 查看系统I/O状况
# iostat属于sysstat软件包。所以安装sar的时候,已经安装过了。
# -d 显示磁盘使用情况
# -x 显示详细情况
# -k -m等以KB、MB为单位显示结果
# 第一个 1 表示每秒抽样一次,默认1
# 第二个 1 表示总共抽样一次,默认1
# 以KB为单位,抽样1次磁盘信息
iostat -d -k 1 1
iostat -dk
# 返回结果
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.91 0.36 9.60 12854466 344688196
vdb 0.01 0.18 0.28 6442838 9923880
# Device设备名称
# tps每秒处理的I/O请求数
# kB_read/s每秒从设备读取的数据量
# kB_wrtn/s每秒向设备写入的数据量
# kB_read读取的数据总量
# kB_wrtn写入的数据总量
# 显示指定磁盘的I/O信息
iostat -d /dev/sda
# 实时监控,每3秒一次抽样,以为KB单位显示磁盘详细信息,按 CTRL+C 退出监控
iostat -dxk 3
# 返回结果
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 1.51 0.02 0.89 0.36 9.60 21.99 0.00 2.32 2.24 2.32 0.91 0.08
vdb 0.00 0.07 0.01 0.00 0.18 0.28 88.44 0.00 50.08 3.32 195.25 1.78 0.00
# Device设备名称
# rrqm/s 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
# wrqm/s 每秒对该设备的写请求被合并次数
# r/s 每秒完成的读次数
# w/s 每秒完成的写次数
# rkB/s 每秒读数据量(kB为单位)
# wkB/s 每秒写数据量(kB为单位)
# avgrq-sz 平均每次IO操作的数据量(扇区数为单位)
# avgqu-sz 平均等待处理的IO请求队列长度
# await 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
# svctm 平均每次IO请求的处理时间(毫秒为单位)
# %util 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
# 对于以上示例输出,我们可以获取到以下信息:
# 每秒向磁盘上写入9KB左右数据(wkB/s值)
# 每秒有1次不到的IO操作(r/s+w/s),其中以写操作为主体
# 平均每次IO请求等待时间为2.32毫秒(await),处理时间为0.91毫秒(svctm)
# 等待处理的IO请求队列中,没有驻留(avgqu-sz)
alias
查看系统所有的命令别名 alias
设置命令别名,如:alias lm='ls -al'
type
通过type命令,我们可以知道某个命令是否为bash的内置命令
加入 -a 参数,可以显示命令完整的路径,跟 whereis which 等有类似的效果
type -a php
journalctl
查看Linux系统日志
journalctl --since="2024-05-30"