一些常用的 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 显示档案的开头至标准输出中,默认前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&param2=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

results matching ""

    No results matching ""