1. top
top 命令是最流行的性能监视工具之一,我们必需了解。它是一个优秀的交互式工具,用于监视性能。它提供系统整体性能,但报告进程信息才是 top 命令的长处。
一.输出主要信息介绍:top 界面分为两个部份
上部份显示关于系统整体性能.
up: 系统开机但现在运行的时间; users:用户数 ;
load average: 对应cpu 1分钟 5分钟 15分钟的平均负载
Tasks:total –总任务数/进程 running-正在运行进程数 sleeping-睡眠进程数
stopped-停止的进程数 zombie-僵尸进程数
Cpu(s):表示这一行显示CPU总体信息
us:用户进程占用CPU时间百分比.不包含renice值为负的任务占用的CPU的时间。
sy:内核占用CPU时间百分比
ni:renice值为负的任务的用户态进程的CPU时间百分比。nice是优先级的意思
id:空闲CPU时间百分比
wa:等待I/O的CPU时间百分比
hi:CPU硬中断时间百分比
si:CPU软中断时间百分比
st:
Men:内存的意思
total:物理内存总量 [total = used + free]
used:使用的物理内存量
free:空闲的物理内存量
buffers:用作内核缓存的物理内存量
Swap:交换空间 [total = used + free ]
total:交换区总量
used:使用的交换区量
free:空闲的交换区量
cached:缓冲交换区总量
下部份列表显示各进程信息.
序列号 |
列名 |
含义 |
a |
PID |
进程id |
b |
PPID |
父进程id |
c |
RUSER |
Real user name |
d |
UID |
进程所有者的用户id |
e |
USER |
进程所有者的用户名 |
f |
GROUP |
进程所有者的组名 |
g |
TTY |
启动进程的终端名。不是从终端启动的进程则显示为 ? |
h |
PR |
优先级 |
I |
NI |
nice值。负值表示高优先级,正值表示低优先级 |
j |
P |
最后使用的CPU,仅在多CPU环境下有意义 |
k |
%CPU |
上次更新到现在的CPU时间占用百分比 |
l |
TIME |
进程使用的CPU时间总计,单位秒 |
m |
TIME+ |
进程使用CPU时间总计,单位:秒 |
n |
%MEM |
进程使用物理内存的百分比 |
o |
VIRT |
进程使用虚拟内存总量,单位kb VIRT=SWAP+RES |
p |
SWAP |
进程使用的虚拟内存中,被换出的大小,单位kb。 |
q |
RES |
进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA |
r |
CODE |
可执行代码占用的物理内存大小,单位kb |
s |
DATA |
可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb |
t |
SHR |
共享内存的大小 |
u |
nFLT |
页面错误次数 |
v |
nDRT |
最后一次写入到现在,被修改过的页面数。 |
w |
S |
进程状态: D=不可中断的睡眠状态 |
x |
COMMAND |
命令名/命令行 |
y |
WCHAN |
若该进程在睡眠,则显示睡眠中的系统函数名 |
z |
Flags |
任务标志 |
二.指令使用说明:
d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变
p 通过指定监控进程ID来仅仅监控某个进程的状态。
S 指定累计模式
s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
i 使top不显示任何闲置或者僵死进程。
c 显示整个命令行而不只是显示命令名
下面介绍在top命令执行过程中可以使用的一些交互命令。
Ctrl+L 擦除并且重写屏幕。
h或者? 显示帮助画面,给出一些简短的命令总结说明。
k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。
i 忽略闲置和僵死进程。这是一个开关式命令。
q 退出程序。
r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
S 切换到累计模式。
s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
f或者F 从当前显示中添加或者删除项目。
o或者O 改变显示项目的顺序。
l 切换显示平均负载和启动时间信息。
m 切换显示内存信息。
t 切换显示进程和CPU状态信息。
c 切换显示命令名称和完整命令行。
M 根据驻留内存大小进行排序。
P 根据CPU使用百分比大小进行排序。
T 根据时间/累计时间进行排序。
W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。
三.常用用法
top -d [刷新间隔的时间]
top -s [安全模式启动]
top -p pid[监视指定pid的进程]
top -i [不显示任何闲置或者僵死进程]
2. ls
ls命令是linux下最常用的命令。ls命令就是list的缩写,缺省下ls用来打印出当前目录的清单,如果ls指定其他目录,那么就会显示指定目录里的文件及文件夹清单。通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限),查看目录信息等等,ls 命令在日常的linux操作中用的很多,在此给大家介绍一下ls 命令的使用方法。
一、 ls指令使用说明
ls命令格式:ls [选项] [目录名]ls命令功能:列出目标目录中所有的子目录和文件。ls 命令的参数选项说明: -a, –all 列出目录下的所有文件,包括以 . 开头的隐含文件。
-A, –almost-all 列出除了 . 及 .. 以外的任何项目
–author 印出每个文件的作者
-b, –escape 把文件名中不可输出的字符用反斜杠加字符编号的形式列出。
–block-size=大小块以指定<大小>的字节为单位
-B, –ignore-backups 不列出任何以~ 字符结束的项目
-c 输出文件的 ctime (文件状态最后更改的时间),并根据 ctime 排序。
-C 每栏由上至下列出项目
–color[=WHEN] 控制是否使用色彩分辨文件。WHEN 可以是"never"(默认)、"always"或"auto"其中之一
-d, –directory 将目录象文件一样显示,而不是显示其下的文件。
-D, –dired 产生适合 Emacs 的 dired 模式使用的结果
-f 对输出的文件不进行排序,-aU 选项生效,-lst 选项失效
-F, –classify 加上文件类型的指示符号 (*/=@| 其中一个)
–format=关键字 across -x,commas -m,horizontal -x,long -l,single-column -1,verbose -l,vertical -C
–full-time 即 -l –time-style=full-iso
-g 类似 -l,但不列出所有者
-G, –no-group 不列出任何有关组的信息
-h, –human-readable 以容易理解的格式列出文件大小 (例如 1K 234M 2G)
–si 类似 -h,但文件大小取 1000 的次方而不是 1024
-H, –dereference-command-line 使用命令列中的符号链接指示的真正目的地
–indicator-style=方式 指定在每个项目名称后加上指示符号<方式>:
none (默认),classify (-F),file-type (-p)
-i, –inode 印出每个文件的 inode 号
-I, –ignore=样式 不印出任何符合 shell 万用字符<样式>的项目
-k 即 –block-size=1K,以 k 字节的形式表示文件的大小。
-l 列出文件的详细信息。
-L, –dereference 当显示符号链接的文件信息时,显示符号链接所指示的对象而并非符号链接本身的信息
-m 所有项目以逗号分隔,并填满整行行宽
-n, –numeric-uid-gid 类似 -l,用数字的 UID,GID 代替名称。
-N, –literal 印出未经处理的项目名称 (例如不特别处理控制字符)
-o 类似 -l,显示文件的除组信息外的详细信息。
-p, -F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套接字(sockets)。
-q, –hide-control-chars 以 ? 字符代替无法打印的字符
–show-control-chars 直接显示无法打印的字符 (这是默认方式,除非调用的程序名称是‘ls’而且是在终端机画面输出结果)
-Q, –quote-name 将项目名称括上双引号
–quoting-style=方式 使用指定的 quoting <方式>显示项目的名称:literal、locale、shell、shell-always、c、escape
-r, –reverse 依相反次序排列
-R, –recursive 同时列出所有子目录层
-s, –size 以块大小为单位列出所有文件的大小
-S 根据文件大小排序
–sort=WORD 以下是可选用的 WORD 和它们代表的相应选项:
extension -X status -c
none -U time -t
size -S atime -u
time -t access -u
version -v use -u
-t 以文件修改时间排序
-u 配合 -lt:显示访问时间而且依访问时间排序
配合 -l:显示访问时间但根据名称排序
否则:根据访问时间排序
-U 不进行排序;依文件系统原有的次序列出项目
-v 根据版本进行排序
-w, –width=COLS 自行指定屏幕宽度而不使用目前的数值
-x 逐行列出项目而不是逐栏列出
-X 根据扩展名排序
-1 每行只列出一个文件
–help 显示此帮助信息并离开
–version 显示版本信息并离开
二、 Linux ls 常用用法。
ls –l -R /file 或者 ls -lR /file[列出/file 文件夹下的所有文件和目录的详细信息] ls -F | grep/$ [只列出子目录] ls -l | grep “^d”[列出当前目录的子目录名或文件名] ls -l s* [在当前目录下列出名称是s 开头文件或目录]
ls –AF[列出目前工作目录下所有档案及目录;目录于名称后加”/”]
三、 输出结果 用ls -l命令查看某一个目录会得到一个9个字段的列表.分别是[总用量(total)这个数值是该目录下所有文件及目录列表大小的和(以k为单位)][文件属性字段][文件硬链接数或目录子目录数][文件拥有者][文件拥有者所在的组][文件大小(单位:)][文件创建日期][文件创建时间][文件名]
3. chmod
文件或目录权限的控制分别以读取,写入,执行3种一般权限来区分,另有3种特殊权限可供运用,再搭配拥有者与所属群组管理权限范围。使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果您对符号连接修改权限,其改变会作用在被连接的原始文件。
一、chmod指令使用说明:
权限范围的表示法如下:
u:User,即文件或目录的拥有者。
g:Group,即文件或目录的所属群组。
o:Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围。
a:All,即全部的用户,包含拥有者,所属群组以及其他用户。
有关权限代号的部分,列表于下:
r:读取权限,数字代号为"4"。
w:写入权限,数字代号为"2"。
x:执行或切换权限,数字代号为"1"。
-:不具任何权限,数字代号为"0"。
s:特殊?b>功能说明:变更文件或目录的权限。
参数:
-c或--changes 效果类似"-v"参数,但仅回报更改的部分。
-f或--quiet或--silent 不显示错误信息。
-R或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。
-v或--verbose 显示指令执行过程。
--help 在线帮助。
--reference=<参考文件或目录> 把指定文件或目录的权限全部设成和参考文件或目录的权限相同
--version 显示版本信息。
<权限范围>+<权限设置> 开启权限范围的文件或目录的该项权限设置。
<权限范围>-<权限设置> 关闭权限范围的文件或目录的该项权限设置。
<权限范围>=<权限设置> 指定权限范围的文件或目录的该项权限设置。
使用方法:
chmod [-cfRv][--help][--version][<权限范围>+/-/=<权限设置...>][文件或目录...] 或 chmod [-cfRv][--help][--version][数字代号][文件或目录...] 或 chmod [-cfRv][--help][--reference=<参考文件或目录>][--version][文件或目录...]
二、常用用法
chmod u+x file 给file的属主增加执行权限
chmod 751 file 给file的属主分配读、写、执行(7)的权限,给file的所在组分配读、执行(5)的权限,给其他用户分配执行(1)的权限
chmod u=rwx,g=rx,o=x file 上例的另一种形式
chmod =r file 为所有用户分配读权限
chmod 444 file 同上例
chmod a-wx,a+r file 同上例
chmod -R u+r directory 递归地给directory目录下所有文件和子目录的属主分配读的权限
4. rm
删除文件或目录。
一、rm指令使用说明
使用方法
rm [-dfirv][--help][--version][文件或目录...]
执行rm指令可删除文件或目录,如欲删除目录必须加上参数"-r",否则预设仅会删除文件。
参数:
-d或--directory 直接把欲删除的目录的硬连接数据删成0,删除该目录。
-f或--force 强制删除文件或目录。
-i或--interactive 删除既有文件或目录之前先询问用户。
-r或-R或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。
-v或--verbose 显示指令执行过程。
--help 在线帮助。
--version 显示版本信息。
二、常用用法
rm -r file --当删除目录时要加上-r参数
rm -r * --删除当前目录下所有文件及目录
rm -rf file --递归强制删除文件和目录
5. mkdir
建立目录
一、rm指令使用说明:
使用用法:mkdir [-p][--help][--version][-m <目录属性>][目录名称]
补充说明:mkdir可建立目录并同时设置目录的权限。
参数:
-m<目录属性>或--mode<目录属性> 建立目录时同时设置目录的权限。
-p或--parents 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录。
--help 显示帮助。
--verbose 执行时显示详细的信息。
--version 显示版本信息。
二、常用用法
mkdir dir 在当前目录下建立dir目录
mkdir -p dir1/dir2 在当前目录下创建dir1目录,并在dir1目录下创建dir2目录,也就是连续创建两个目录(dir1/和dir1/dir2)
mkdir -m 744 dir 在当前目录下创建dir并[-m]赋予权限
6. ps
显示瞬间行程 (process) 的动态
一、rm指令使用说明
使用用法:ps [options] [--help]
参数:
ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义
-A 列出所有的行程
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程
au(x) 输出格式 :
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER: 行程拥有者
PID: pid
%CPU: 进程使用的 CPU 使用率
%MEM: 进程使用物理内存的百分比
VSZ: 进程使用虚拟n内存大小
RSS: 进程使用的内存大小
TTY: 启动进程的终端名。不是从终端启动的进程则显示为 ?
STAT: 该行程的状态:
D: 不可中断的静止
R: 正在执行中
S: 静止状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程
L: 有内存分页分配并锁在记忆体内 (即时系统或捱A I/O)
START: 行程开始时间
TIME: 执行的时间
COMMAND:所执行的指令
二、常用用法
ps
PID TTY TIME CMD
2791 ttyp0 00:00:00 tcsh
3092 ttyp0 00:00:00 ps
% ps -A
PID TTY TIME CMD
1 ? 00:00:03 init
2 ? 00:00:00 kflushd
3 ? 00:00:00 kpiod
4 ? 00:00:00 kswapd
5 ? 00:00:00 mdrecoveryd
.......
% ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.7 1096 472 ? S Sep10 0:03 init [3]
root 2 0.0 0.0 0 0 ? SW Sep10 0:00 [kflushd]
root 3 0.0 0.0 0 0 ? SW Sep10 0:00 [kpiod]
root 4 0.0 0.0 0 0 ? SW Sep10 0:00 [kswapd]
具体命令解释如下:
1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。
2)ps -A 显示所有程序。
3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
4)ps -e 此参数的效果和指定"A"参数相同。
5)ps e 列出程序时,显示每个程序所使用的环境变量。
6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
7)ps -H 显示树状结构,表示程序间的相互关系。
8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
9)ps s 采用程序信号的格式显示程序状况。
10)ps S 列出程序时,包括已中断的子程序资料。
11)ps -t<终端机编号>
指定终端机编号,并列出属于该终端机的程序的状况。
12)ps u
以用户为主的格式来显示程序状况。
13)ps x
显示所有程序,不以终端机来区分。
最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。
ps –ef | grep java 查看包含进程名包含“java”的进程
7. grep
grep是linux中很常用的一个命令,主要功能就是进行字符串数据的对比,能使用正则表达式搜索文本,并将符合用户需求的字符串打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。grep在数据中查找出一个字符串时,是以整行为单位来进行数据选取的。
一、grep 指令使用说明
(1)使用用法:grep [cinvs] 'patten' filename
(2)主要参数
-c:只输出匹配行的计数。
-i:不区分大小写(只适用于单字符)。
-n:显示匹配行及行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
(3)patten正则表达式主要参数
\ :转义字符,忽略正则表达式中特殊字符的原有含义。
^ :匹配以某个字符串开始的行。
$ : 匹配以某个字符串结束的行。
\<:从匹配正则表达式的行开始。
\>:到匹配正则表达式的行结束。
[ ]:在[]内个某单个字符,如[A]即A符合要求 。
[ - ] :属于[ - ]所标记的范围字符,如[A-Z],即A、B、C一直到Z都符合要求 。
. :表示一定有1个任意字符。
* :重复前面0个或多个字符。
关于正则表达式的参数还有很多,这里这是列出很少的一部分,具体大家可以参照正则表达式的详解。
二、常用用法
要用好grep这个工具,其实就是要写好正则表达式,所以这里不对grep的所有功能进行实例讲解,只列几个例子,讲解一个正则表达式的写法。
ls -l | grep '^a' [通过管道过滤ls -l输出的内容,只显示以a开头的行]
grep 'test' aa bb cc [显示在aa,bb,cc文件中匹配test的行]
grep '\{5\}' aa [示所有包含每个字符串至少有5个连续小写字符的字符串的行]
grep 'w\(es\)t.*' aa [显示所有包含west,且之后含有零个或多个任意字符的行]
8. find
一、 find指令使用说明
用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
默认路径为当前目录;默认表达式为 -print
表达式可能由下列成份组成:操作符、选项、测试表达式以及动作:
操作符 (优先级递减;未做任何指定时默认使用 -and):
( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2
EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2
位置选项 (总是真): -daystart -follow -regextype
普通选项 (总是真,在其它表达式前指定):
-depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
--version -xdev -ignore_readdir_race -noignore_readdir_race
测试(N可以是 +N 或-N 或 N):-amin N -anewer FILE -atime N -cmin
-cnewer 文件 -ctime N -empty -false -fstype 类型 -gid N -group 名称
-ilname 匹配模式 -iname 匹配模式 -inum N -ipath 匹配模式 -iregex 匹配模式
-links N -lname 匹配模式 -mmin N -mtime N -name 匹配模式 -newer 文件
-nouser -nogroup -path 匹配模式 -perm [+-]访问模式 -regex 匹配模式
-readable -writable -executable
-wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N
-used N -user NAME -xtype [bcdpfls]
动作: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print
-fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit
-exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
-execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;
二.常用参数说明+实例
1、name选项,按名称查找
查找当前目录下的manage.py 文件:find . -name 'manage.py'
2、atime/ctime/mtime选项,根据时间(24小时为单位)查找
注:a表示access,c表示create,m表示modify
查找24小时之内创建的文件: find . -ctime -1
查找24小时之前创建的文件: find . -ctime 1
注:atime和mtime用法一致
3、amin/cmin/mmin选项,根据时间查找
查找10分钟之内创建的文件: find . -cmin -10
查找10分钟之前创建的文件: find . -cmin 10
注:amin和mmin用法一致
4、anewer/cnewer/mnewer,查找比某一文件新的文件
查找在hello.py之后访问过的文件:find . -anewer hello.py
5、user
查找属于某一用户的文件:find . -user the5fire
6、type
查找所有文件:find . -type f
查找所有目录包含demo的目录:find . -type d -name '*demo*'
7、exec,据说是很强大的参数
查找'setup.py'文件,然后打开: find . -name 'setup.py' -exec vim {} \;
另外一个最常用的,强制删除项目下面的所有.svn文件目录,find . -name '.svn' -exec rm -rf {} \;
8、empty
显示所有的空白文件,并显示详细:find . -empty -ls #加ls完全画蛇添足,只是为了说明这个参数。
9、size
显示大小为10k的文件:find . -size 10k
显示所有大于10k的文件:find . -size +10k
显示所有小于10k的文件:find .-size -10k
10、or、and、not, 或、与、非查询
查找大于10k或者名称含有demo的文件:find . -size +10k -o -name '*demo*'
查找大于10k且小于100k的文件:find . -size +10k -a -size -100k
查找大于10k并且名称不含有demo的文件:find . -size +10k ! -name '*demo*'
11、perm,根据文件权限查找
注:如查找权限为600的文件:find . -perm 600,如果权限前面加“-”号,表示满足一位匹配即可,
如:find . -perm 007会匹配权限为007、077、777的文件
12、regex,用正则表达式查找
如: find . -regex '.*/[0-9]\w.*'(匹配以数字开头的文件)
13、-maxdepth,限制目录深度查找
查找一级目录下的所有py文件:find . -name '*.py' -maxdepth 1
9. awk
一. awk指令使用说明
用法: awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]
参数说明:
-F re:允许awk更改其字段分隔符。
parameter: 该参数帮助为不同的变量赋值。
'prog': awk的程序语句段。这个语句段必须用单拓号:'和'括起,以防被shell解释。这个程序语句段的标准形式为:
'pattern {action}'
其中pattern参数可以是egrep正则表达式中的任何一个,它可以使用语法/re/再加上一些样式匹配技巧构成。action参数总是被大括号包围,它由一系统awk语句组成,各语句之间用";"分隔。awk解释它们,并在pattern给定的样式匹配的记录上执行其操作。与shell类似,你也可以使用“#”作为注释符,它使“#”到行尾的内容成为注释,在解释执行时,它们将被忽略。你可以省略pattern和action之一,但不能两者同时省略,当省略pattern时没有样式匹配,表示对所有行(记录)均执行操作,省略action时执行缺省的操作――在标准输出上显示。
-f progfile:允许awk调用并执行progfile指定有程序文件。progfile是一个文本文件,他必须符合awk的语法。
in_file:awk的输入文件,awk允许对多个输入文件进行处理。值得注意的是awk不修改输入文件。如果未指定输入文件,awk将接受标准输入,并将结果显示在标准输出上。awk支持输入输出重定向.
二.常用方面说明+实例
1、awk的记录、字段与内置变量:
例:显示文本文件myfile中第七行到第十五行中以字符%分隔的第一字段,第三字段和第七字段:
awk -F % 'NR==7,NR==15 {printf $1 $3 $7}'
2、awk的内置函数:
例:显示文件myfile中的行号和第3字段:
$awk '{printf"%03d%s",NR,$1}' myfile
3、在命令行使用awk
例:显示文本文件mydoc匹配(含有)字符串"sun"的所有行。
$awk '/sun/{print}' mydoc
由于显示整个记录(全行)是awk的缺省动作,因此可以省略action项。
$awk '/sun/' mydoc
例:下面是一个较为复杂的匹配的示例:
$awk '/[Ss]un/,/[Mm]oon/ {print}' myfile
它将显示第一个匹配Sun或sun的行与第一个匹配Moon或moon的行之间的行,并显示到标准输出上。
例:下面的示例显示了内置变量和内置函数length()的使用:
$awk 'length($0)>80 {print NR}' myfile
该命令行将显示文本myfile中所有超过80个字符的行号,在这里,用$0表示整个记录(行),同时,内置变量NR不使用标志符'$'。
例:作为一个较为实际的例子,我们假设要对UNIX中的用户进行安全性检查,方法是考察/etc下的passwd文件,检查其中的passwd字段(第二字段)是否为"*",如不为"*",则表示该用户没有设置密码,显示出这些用户名(第一字段)。我们可以用如下语句实现:
#awk -F: '$2=="" {printf("%s no password!",$1' /etc/passwd
在这个示例中,passwd文件的字段分隔符是“:”,因此,必须用-F:来更改默认的字段分隔符,这个示例中也涉及到了内置函数printf的使用。
awk的变量
如同其它程序设计语言一样,awk允许在程序语言中设置变量,事实上,提供变量的功能是程序设计语言的其本要求,不提供变量的程序设计语言本人还从未见过。
awk提供两种变量,一种是awk内置的变量,这前面我们已经讲过,需要着重指出的是,与后面提到的其它变量不同的是,在awk程序中引用内置变量不需要使用标志符"$"(回忆一下前面讲过的NR的使用)。awk提供的另一种变量是自定义变量。awk允许用户在awk程序语句中定义并调用自已的变量。当然这种变量不能与内置变量及其它awk保留字相同,在awk中引用自定义变量必须在它前面加上标志符"$"。与C语言不同的是,awk中不需要对变量进行初始化,awk根据其在awk中第一次出现的形式和上下文确定其具体的数据类型。当变量类型不确定时,awk默认其为字符串类型。这里有一个技巧:如果你要让你的awk程序知道你所使用的变量的明确类型,你应当在在程序中给它赋初值。在后面的实例中,我们将用到这一技巧。
运算与判断:
作为一种程序设计语言所应具有的特点之一,awk支持多种运算,这些运算与C语言提供的几本相同:如+、-、*、/、%等等,同时,awk也支持C语言中类似++、--、+=、-=、=+、=-之类的功能,这给熟悉C语言的使用者编写awk程序带来了极大的方便。作为对运算功能的一种扩展,awk还提供了一系列内置的运算函数(如log、sqr、cos、sin等等)和一些用于对字符串进行操作(运算)的函数(如length、substr等等)。这些函数的引用大大的提高了awk的运算功能。
作为对条件转移指令的一部分,关系判断是每种程序设计语言都具备的功能,awk也不例外。awk中允许进行多种测试,如常用的==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、>=(小于等于)等等,同时,作为样式匹配,还提供了~(匹配于)和!~(不匹配于)判断。
作为对测试的一种扩充,awk也支持用逻辑运算符:!(非)、&&(与)、||(或)和括号()进行多重判断,这大大增强了awk的功能。本文的附录中列出了awk所允许的运算、判断以及操作符的优先级。
awk的流程控制
流程控制语句是任何程序设计语言都不能缺少的部分。任何好的语言都有一些执行流程控制的语句。awk提供的完备的流程控制语句类似于C语言,这给我们编程带来了极大的方便。
1、BEGIN和END:
在awk中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。
例:累计销售文件xs中的销售金额(假设销售金额在记录的第三字段):
$awk
>'BEGIN { FS=":";print "统计销售金额";total=0}
>{print $3;total=total+$3;}
>END {printf "销售金额总计:%.2f",total}' sx
(注:>是shell提供的第二提示符,如要在shell程序awk语句和awk语言中换行,则需在行尾加反斜杠)
在这里,BEGIN预置了内部变量FS(字段分隔符)和自定义变量total,同时在扫描之前显示出输出行头。而END则在扫描完成后打印出总合计。
2、流程控制语句
awk提供了完备的流程控制语句,其用法与C语言类似。下面我们一一加以说明:
2.1、if...else语句:
格式:
if(表达式)
语句1
else
语句2
2.2、while语句
格式为:
while(表达式)
语句
2.3、do-while语句
格式为:
do
{
语句
}while(条件判断语句)
2.4、for语句
格式为:
for(初始表达式;终止条件;步长表达式)
{语句}
在awk的 while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break中断当前正在执行的循环并跳到循环外执行下一条语句。continue从当前位置跳到循环开始处执行。对于exit的执行有两种情况:当exit语句不在END中时,任何操作中的exit命令表现得如同到了文件尾,所有模式或操作执行将停止,END模式中的操作被执行。而出现在END中的exit将导致程序终止。
例:为了awk中的自定义函数
定义和调用用户自己的函数是几乎每个高级语言都具有的功能,awk也不例外,但原始的awk并不提供函数功能,只有在nawk或较新的awk版本中才可以增加函数。
函数的使用包含两部分:函数的定义与函数调用。其中函数定义又包括要执行的代码(函数本身)和从主程序代码传递到该函数的临时调用。
awk函数的定义方法如下:
function 函数名(参数表){
函数体
}
在gawk中允许将function省略为func,但其它版本的awk不允许。函数名必须是一个合法的标志符,参数表中可以不提供参数(但在调用函数时函数名后的一对括号仍然是不可缺少的),也可以提供一个或多个参数。与C语言相似,awk的参数也是通过值来传递的。
在awk中调用函数比较简单,其方法与C语言相似,但awk比C语言更为灵活,它不执行参数有效性检查。换句话说,在你调用函数时,可以列出比函数预计(函数定义中规定)的多或少的参数,多余的参数会被awk所忽略,而不足的参数,awk将它们置为缺省值0或空字符串,具体置为何值,将取决于参数的使用方式。
awk函数有两种返回方式:隐式返回和显式返回。当awk执行到函数的结尾时,它自动地返回到调用程序,这是函数是隐式返回的。如果需要在结束之前退出函数,可以明确地使用返回语句提前退出。方法是在函数中使用形如:return 返回值 格式的语句。
例:下面的例子演示了函数的使用。在这个示例中,定义了一个名为print_header的函数,该函数调用了两个参数FileName和PageNum,FileName参数传给函数当前使用的文件名,PageNum参数是当前页的页号。这个函数的功能是打印(显示)出当前文件的文件名,和当前页的页号。完成这个功能后,这个函数将返回下一页的页号。
nawk
>'BEGIN{pageno=1;file=FILENAME
>pageno=print_header(file,pageno);#调用函数print_header
>printf("当前页页号是:%d",pageno);
>}
>#定义函数print_header
>function print_header(FileName,PageNum){
>printf("%s %d",FileName,PageNum); >PageNum++;return PageNUm;
>}
>}' myfile
执行这个程序将显示如下内容:
myfile 1
当前页页号是:2
awk高级输入输出
1.读取下一条记录:
awk的next语句导致awk读取下一个记录并完成模式匹配,然后立即执行相应的操作。通常它用匹配的模式执行操作中的代码。next导致这个记录的任何额外匹配模式被忽略。
2.简单地读取一条记录
awk的 getline语句用于简单地读取一条记录。如果用户有一个数据记录类似两个物理记录,那么getline将尤其有用。它完成一般字段的分离(设置字段变量$0 FNR NF NR)。如果成功则返回1,失败则返回0(到达文件尾)。如果需简单地读取一个文件,则可以编写以下代码:
例:示例getline的使用
{while(getline==1)
{
#process the inputted fields
}
}
也可以使getline保存输入数据在一个字段中,而不是通过使用getline variable的形式处理一般字段。当使用这种方式时,NF被置成0,FNR和NR被增值。
用户也可以使用getline<"filename"方式从一个给定的文件中输入数据,而不是从命令行所列内容输入数据。此时,getline将完成一般字段分离(设置字段变量$0和NF)。如果文件不存在,返回-1,成功,返回1,返回0表示失败。用户可以从给定文件中读取数据到一个变量中,也可以用stdin(标准输入设备)或一个包含这个文件名的变量代替filename。值得注意的是当使用这种方式时不修改FNR和NR。
另一种使用getline语句的方法是从UNIX命令接受输入,例如下面的例子:
例:示例从UNIX命令接受输入
{while("who -u"|getline)
{
#process each line from the who command
}
}
当然,也可以使用如下形式:
"command" | getline variable
3.关闭文件:
awk中允许在程序中关闭一个输入或输出文件,方法是使用awk的close语句。
close("filename")
filename可以是getline打开的文件(也可以是stdin,包含文件名的变量或者getline使用的确切命令)。或一个输出文件(可以是stdout,包含文件名的变量或使用管道的确切命令)。
4.输出到一个文件:
awk中允许用如下方式将结果输出到一个文件:
printf("hello word!")>"datafile"
或
printf("hello word!")>>"datafile"
5.输出到一个命令
awk中允许用如下方式将结果输出到一个命令:
printf("hello word!")|"sort-t','"
awk与shell script混合编程
因为awk可以作为一个shell命令使用,因此awk能与shell批处理程序很好的融合在一起,这给实现awk与shell程序的混合编程提供了可能。实现混合编程的关键是awk与shell script之间的对话,换言之,就是awk与shell script之间的信息交流:awk从shell script中获取所需的信息(通常是变量的值)、在awk中执行shell命令行、shell script将命令执行的结果送给awk处理以及shell script读取awk的执行结果等等。
1.awk读取Shell script程序变量
在awk中我们可以通过“'$变量名'”的方式读取sell scrpit程序中的变量。
例:在下面的示例中,我们将读取sell scrpit程序中的变量Name,该变量存放的是文本myfile的撰写者,awk将打印出这个人名。
$cat writename
:
# @(#)
#
.
Name="张三" nawk 'BEGIN {name="'Name'"; printf("%s撰写者%s",FILENAME,name");}
{...}END{...}' myfile
2.将shell命令的执行结果送给awk处理
作为信息传送的一种方法,我们可以将一条shell命令的结果通过管道线(|)传递给awk处理:
例:示例awk处理shell命令的执行结果
$who -u | awk '{printf("%s正在执行%s",$2,$1)}'
该命令将打印出注册终端正在执行的程序名。
3.shell script程序读awk的执行结果
为了实现shell script程序读取awk执行的结果,我们可以采取一些特殊的方法,例如我们可以用变量名=`awk语句`的形式将awk执行的结果存放入一个shell script变量。当然也可以用管道线的方法将awk执行结果传递给shell script程序处理。
例:作为传送消息的机制之一,UNIX提供了一个向其所有用户传送消息的命令wall(意思是write to all写给所有用户),该命令允许向所有工作中的用户(终端)发送消息。为此,我们可以通过一段shell批处理程序wall.shell来模拟这一程序(事实上比较老的版本中wall就是一段shell批处理程序:
$cat wall.shell
:
# @(#) wall.shell:发送消息给每个已注册终端
#
cat >/tmp/$$
#用户录入消息文本 who -u | awk '{print $2}' | while read tty
do
cat /tmp/$$>$tty
done
在这个程序里,awk接受who -u命令的执行结果,该命令打印出所有已注册终端的信息,其中第二个字段是已注册终端的设备名,因此用awk命令析出该设备名,然后用while read tty语句循环读出这些文件名到变量(shell script变量)tty中,作为信息传送的终结地址。
4.在awk中执行shell命令行----嵌入函数system()
system()是一个不适合字符或数字类型的嵌入函数,该函数的功能是处理作为参数传递给它的字符串。system对这个参数的处理就是将其作为命令处理,也就是说将其当作命令行一样加以执行。这使得用户在自己的awk程序需要时可以灵活地执行命令或脚本。
例:下面的程序将使用system嵌入函数打印用户编制好的报表文件,这个文件存放在名为myreport.txt的文件中。为简约起见,我们只列出了其END部分:
END {close("myreport.txt");system("lp myreport.txt");}
在这个示例中,我们首先使用close语句关闭了文件myreport.txt文件,然后使用system嵌入函数将myreport.txt送入打印机打印。
附录:
1.awk的常规表达式元字符
换码序列
^ 在字符串的开头开始匹配
$ 在字符串的结尾开始匹配
. 与任何单个字符串匹配
[ABC] 与[]内的任一字符匹配
[A-Ca-c] 与A-C及a-c范围内的字符匹配(按字母表顺序)
[^ABC] 与除[]内的所有字符以外的任一字符匹配
Desk|Chair 与Desk和Chair中的任一个匹配
[ABC][DEF] 关联。与A、B、C中的任一字符匹配,且其后要跟D、E、F中的任一个字符。
* 与A、B或C中任一个出现0次或多次的字符相匹配
+ 与A、B或C中任何一个出现1次或多次的字符相匹配
? 与一个空串或A、B或C在任何一个字符相匹配
(Blue|Black)berry 合并常规表达式,与Blueberry或Blackberry相匹配
2.awk算术运算符
运算符 用途
------------------
x^y x的y次幂
x**y 同上
x%y 计算x/y的余数(求模)
x+y x加y
x-y x减y
x*y x乘y
x/y x除y
-y 负y(y的开关符号);也称一目减
++y y加1后使用y(前置加)
y++ 使用y值后加1(后缀加)
--y y减1后使用y(前置减)
y-- 使用后y减1(后缀减)
x=y 将y的值赋给x
x+=y 将x+y的值赋给x
x-=y 将x-y的值赋给x
x*=y 将x*y的值赋给x
x/=y 将x/y的值赋给x x%=y 将x%y的值赋给x
x^=y 将x^y的值赋给x
x**=y 将x**y的值赋给x
3.awk允许的正则:
操作符 含义
x==y x等于y
x!=y x不等于y
x>y x大于y
x>=y x大于或等于y
x x<=y x小于或等于y? x~re x匹配正则表达式re? x!~re x不匹配正则表达式re? 4.awk的操作符(按优先级升序排列) = 、+=、 -=、 *= 、/= 、 %= || && > >= < <= == != ~ !~ xy (字符串连结,'x'y'变成"xy") + - * / % ++ -- 5.awk内置变量(预定义变量) 说明:表中v项表示第一个支持变量的工具(下同):A=awk,N=nawk,P=POSIX awk,G=gawk V 变量 含义 缺省值 -------------------------------------------------------- N ARGC 命令行参数个数 G ARGIND 当前被处理文件的ARGV标志符 N ARGV 命令行参数数组 G CONVFMT 数字转换格式 %.6g P ENVIRON UNIX环境变量 N ERRNO UNIX系统错误消息 G FIELDWIDTHS 输入字段宽度的空白分隔字符串 A FILENAME 当前输入文件的名字 P FNR 当前记录数 A FS 输入字段分隔符 空格 G IGNORECASE 控制大小写敏感0(大小写敏感) A NF 当前记录中的字段个数 A NR 已经读出的记录数 A OFMT 数字的输出格式 %.6g A OFS 输出字段分隔符 空格 A ORS 输出的记录分隔符 新行 A RS 输入的记录他隔符 新行 N RSTART 被匹配函数匹配的字符串首 N RLENGTH 被匹配函数匹配的字符串长度 N SUBSEP 下标分隔符 "34" 6.awk的内置函数 V 函数 用途或返回值 ------------------------------------------------ N gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string N index(search,string) 返回string中search串的位置 A length(string) 求串string中的字符个数 N match(string,reg) 返回常规表达式reg匹配的string中的位置 N printf(format,variable) 格式化输出,按format提供的格式输出变量variable。 N split(string,store,delim) 根据分界符delim,分解string为store的数组元素 N sprintf(format,variable) 返回一个包含基于format的格式化数据,variables是要放到串中的数据 G strftime(format,timestamp) 返回一个基于format的日期或者时间串,timestmp是systime()函数返回的时间 N sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串 A substr(string,position,len) 返回一个以position开始len个字符的子串 P totower(string) 返回string中对应的小写字符 P toupper(string) 返回string中对应的大写字符 A atan(x,y) x的余切(弧度) N cos(x) x的余弦(弧度) A exp(x) e的x幂 A int(x) x的整数部分 A log(x) x的自然对数值 N rand() 0-1之间的随机数 N sin(x) x的正弦(弧度) A sqrt(x) x的平方根 A srand(x) 初始化随机数发生器。如果忽略x,则使用system() G system() 返回自1970年1月1日以来经过的时间(按秒计算)