欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

性能测试之linux

程序员文章站 2024-03-22 09:45:10
...

一、linux常用命令
date 命令:显示或设置日期和时间
性能测试之linux
语法:
date [+显示格式] 或 date [MMDDhhmm[[CC]YY][.ss]]
说明:
第一种语法可用来显示系统日期或时间,以% % 为开头的参数为格式参数,可指定日期或时间的显示格式。
  第二种语法可用来设置系统日期与时间。只有管理员才有设置日期与时间的权限。
  若不加任何参数, date 会显示目前的日期与时间。
  只有 root 用户才能更改系统时间,当以 root 身分更改了系统时间之后, , 请记得以 clock - -w w 来将系统时间写入CMOS 中, , 这样下次重新开机时系统时间才会持续保持最新的正确值。

示例:
1、date
2、date +%y/%m/%d-%H:%M:%S
3、date 032010052008.30
4、date –d ‘20080420’ +%a

cal 命令:日历工具
使用方式:cal [-m ] [month [year]]
说明:
显示日历。若只有一个参数, , 则代表年份 (1—9999), 显示该年的年历。年份必须全部写出。使用两个参数, , 则表示月份及年份。若没有参数则显示这个月的月历。
-m
例:显示公元 2008 年 3 月月历。
[aaa@qq.com /root]# cal 3 2008

相对路径与绝对路径
绝对路径:路径的写法一定由根目录 / 写起,例如: /usr/s
hare/doc 这个目录。
相对路径:路径的写法不是由 / 写起,而是有用户的当前目
录写起。例如由 /usr/share/doc 要到 /usr/share/man 底
下时,可以写成:cd ../man 这就是相对路径的写法

. . 代表此层目录
.. 代表上层目录
~ 代表自己的 主目录 (有的地方也称 家目录 )
~ user 代表到 user 这个 用户的主目录

pwd 显示当前工作目录
语 法:pwd
说明:执行pwd指令可立刻得知目前所在的工作目录的绝对路径名称。由于很多的套件所使用的目录名称都相同,例如 /usr/local/etc 还有 /etc ,但是通常Linux仅列出最后面那一个目录而已,这个时候就可以使用 pwd 来知道你的所在目录
,免得搞错目录!

cd 切换工作目录
语 法:cd [目的目录]
说明:cd指令可让用户在不同的目录间切换,但该用户必须拥有足够
的权限进入目的目录。
范例:
[root @test /forest]# cd .. 回到上一层目录
[root @test /forest]# cd ../home 相对路径的写法
[root @test /forest]# cd /var/www/html 绝对路径的写法
[root @test /forest]# cd 回到用户主目录
[root @test /forest]# cd ~ 回到用户主目录
[root @test /forest]# cd ~test 回到 test 用户的主目录

注意,路径与 cd 指令之间存在一个空格

ls 显示目录中的目录和文件名
语 法: ls [选项] [文件目录列表]
说明: ls命令中最常用选项如下:
-a:显示所有文件及目录 (ls规定将文件名或目录名中开头为“.”的视为隐藏文件,不会列出)
-l:除文件名外,也将文件状态、权限、拥有者、文件大小等信息详细列出 。

who 命令:显示当前在系统中登录的所有用户名
who am I 命令:显示当前登录的用户名
Clear 命令:清除终端屏幕
ps 命令:显示当前登录会话的所有活动进程
exit 命令:终止 Linux 会话
shutdown 命令:关闭 Linux 操作系统
使用 passwd 命令可以更改密码
必须使用 chage 命令定期更改密码
要暂时获得 root 或超级用户权限 su

二、vi编辑器使用

**vi 是标准的 Linux 文本编辑程序( ( 相当于 windows 中的记事本) )
vi 不是基于窗口的,所以,这个多用途编辑程序可以用于在
任何类型的终端上编辑各式各样的文件**
格式:vi filename
如果 filename已经存在,vi会打开现存文件
如果是一个新文件,vi会创建它
屏幕的最后一行被称为状态行,用于显示文件名及文件中行和字符
的个数

vi的三种模式
1、编辑模式 — 输入文本
2、一般模式 —执行命令
3、命令行模式 —执行特定命令
一般模式:
在vi处理文件时,一进入该文件就是一般模式了。在这个模
式下,可以进行光标的定位、复制和粘贴文本、删除文本
。此为默认模式。
编辑模式:
当你想输入新的字符的时候,就要用到此模式。在你按下i
、I、a、A、o、O等字母后就会进入编辑模式,编辑模式
的一个特征就是在屏幕的左下角会出现INSERT字样。
命令行模式:
主要用于保存文件,完成文本的查找与替换操作。
一般模式下的常用光标定位指令:
移动光标到文件的最后一行 G
跳到指定行:nG(n=1,2,….) 例如:跳到第3行 3G
从当前行后跳n行 n(回车)
在一行内,移动光标到行首0 (数字,非字母),移动到行尾$
上翻屏: ctrl+f
下翻屏: ctrl+b
一般模式下的复制、粘贴
复制单行 先移动光标到该行上,然后用命令yy进行复制,再移动光标到目的位置按p进
行粘贴。
复制多行 nyy (n用确定的数字来代替,如3),再移动光标到目的位置按p进行粘贴。
一般模式下的删除
删除单个字符 x
连续删除n个字符 nx (n用确定的数字来代替)
删除整行 dd
删除连续的n行 ndd (n用确定的数字来代替)
一般模式下的撤消相关
恢复上次作的修改 u (可连续使用)

命令行模式下的查找与替换
/word 在当前光标之后查找名为word的字符串
?word在当前光标之前查找名为word的字符串
:n1,n2 s/word1/word2/g 在第n1和n2行之间查找word1
字符串,并将该字符串换成word2
:1,s/word1/word2/g11word1word21 s/word1/word2/gc 在第1和最后1行之间查找word1
字符串,并将该字符串换成word2,并提示用户确认。

命令行模式下的文件保存
:w 将正在保存的文件保存
:w! 将正在保存的文件强制保存
:w filename 另存为
:q 不保存退出
:q! 不保存强制退出
:wq 保存后退出
:wq! 保存后强制退出
命令行模式下的显示行号开关
:set nu 显示行号
:set nonu 不显示行号

三、Linux下Shell编程

**什么是shell
在多用户环境中,shell 将用户界面与内核分开。
shell 可解释各种内核命令并充当用户与内核之间
的 接口**

[aaa@qq.com root]# echo $SHELL
/bin/bash
shell 是解释用户在终端键入的命令的一种 中间程序。 我们可以把之前学习的命令写成shell 脚本程序 让shell 解释执行

shell种类:bash、sh、csh、ksh、tcsh、zsh……
Linux默认的是bash
可以参看/bin目录中的内容
shell可以把它理解为一种脚本编程语言,什么是shell程序呢? 简单的说shell程序就是一个包含若干行shell或者linux命令的文件。
现在使用最多的shell脚本一般为sh,我们也可以直接用bash。实际上他们是同一个东西。

对于基本的Linux操作,可以不需要知道怎样撰写shell脚本,但是应该可以看懂简单的shell脚本。
shell脚本是一个可以使用的可执行程序,它汇整一些需要操作的一串连续的指令,与那些二进制的执行文件有相同的执行方式。
linux的很多功能是靠一些脚本程序完成的。
如果是系统管理员或Linux的开发人员,应该了解相应的脚本知识。
请记住:bash既是一个命令,又是一个脚本的解释器,它可以执行一个
命令组合成的程序。

脚本执行
scripts脚本执行时bash会根据下面的规则判断执行的步骤:
1、如果读取到一个回车符号( CR ),就尝试开始执行该行命令;
2、如同前面 bash命令提到的,指令间的多个空白会被忽略掉;
3、空白行也将被忽略掉,并且 tab 也是不会被理会的;
4、至于如果一行的内容太多,则可以使用 \ 来延伸至下一行;
5、此外,使用最多的 # 可做为批注.任何加在 # 后面的字符,将全部被
视为批注文字而被忽略。

在撰写脚本的好习惯:
1、第一行宣告使用的 shell 为何?(如果不声明使用默认的shell解释,
通常应该声明)

#!/bin/sh
#!/bin/bash

2、注明该 script 的内容功能、版本信息、作者、创建文件日期等
3、每一个大步骤的主要功能(也顺便提供自己未来修改时使用)

脚本执行的方法:
1、一个是将该脚本文件改成可以执行的属性,如chmod 75
5 scripts.file ,然后执行该脚本文件;
2、另一种则是直接以 sh或bash 这个执行文件来执行 script
的内容,如:
sh scripts.file
bash scripts.file

建立第一个脚本文件

[root @test test]# vi test01.sh
#!/bin/bash
#  这个脚本是在屏幕输出Hello ! How are you  ?
# Made by homeyw
hello=Hello\ \!\ How\ are\ you\ \?
echo $hello
[root @test test]# sh test01-hello.sh
Hello !
How are you ?

注意:
1、所有在脚本中的东西,基本规则 ( 如变量设定规则 ) 需要与命令提示符下时
相同;
2、脚本的后缀最好为 .sh 提供他人的认识;
3、并非加上 .sh 就可以是执行文件,还需要查看其属性中是否有 x 这个属性。
比较单引号与双引号的区别的脚本:

[root @test test]# vi test02.sh
#!/bin/bash
# 这个脚本用途在于引用两个变量,顺便比较一下\ " 与 ' 的
异同
# Made by homeyw
name=“homeyw"
myname1="My name is $name"
myname2='My name is $name'
echo $name
echo $myname1
echo $myname2

卷标与运算符:
declare 声明变量内容命令
语法: [test @test test]# declare [-afirx]
参数说明:
-a :定义为数组 array
-f :定义为函数 function
-i :定义为整数 integer
-r :定义为只读
-x :定义为通过环境输出变量 (export命令)
范例:

[test @test test]# declare -i a=3
[test @test test]# declare -i b=5
[test @test test]# declare -i c=$a*$b
[test @test test]# echo $c
15

示例:

[root @test test]# vi test03.sh
#!/bin/sh
# This program is used to "declare" variables
number1=2*3+5*13-32+25
declare -i number2=2*3+5*13-32+25
echo "Your result is ==> $number1"
echo "Your result is ==> $number2"
[root @test test]# sh test03-declare.sh
Your result is ==> 2*3+5*13-32+25
Your result is ==> 64

交互式脚本
read命令:
read 的功能就是依据您在键盘输入的内容存放到变量

[root @test test]# read name
homeyw <==这是键盘输入的结果
[root @test test]# echo $name
homeyw
[root @test test]# vi test04-read.sh
#!/bin/bash
# This program is used to "read" variables
#
echo "Please keyin your name, and press Enter to start."
read name
echo "This is your keyin data ==> $name"
[root @test test]# sh test04-read.sh
Please keyin your name, and press Enter to start.
homeyw
This is your keyin data ==> homeyw
定义一个脚本的参数的代号:
[root @test test]# myscript opt1 opt2 opt3 opt4
$0 $1 $2 $3 $4
[root @test test]# vi test05
#!/bin/bash
# This program will define what is the parameters
echo "This script's name => $0"
echo "parameters $1 $2 $3"
[root @test test]# sh test05 pa1 pa2 pa3
This script's name => test05
parameters pa1 pa2 pa3

脚本逻辑判断表达式
如何判定某个文件或目录,或者是如何判定程序应该朝向那个方向行进?
1、 关于文件与目录的检测
-f 常用。检测文件 是否存在
-d 常用。检测 目录是否存在
-L 检测是否为一个 symbolic link 的文件
-e 检测某个东西是否存在
2、关于文件的属性检测
-r 检测是否为可读的属性
-w 检测是否为可以写入的属性
-x 检测是否为可执行的属性
-s 检测是否为非空白文件
3、两个文件之间的判断与比较 ;例如 test file1 -nt file2
-nt 第一个文件比第二个文件新
-ot 第一个文件比第二个文件旧
-ef 第一个文件与第二个文件为同一个文件( link 之类的文件)
4、逻辑的 与(and) 或(or)
&& 逻辑的 AND 的意思
|| 逻辑的 OR 的意思
性能测试之linux
条件判断语句
条件判断一:if then fi 的方式 :
if [ 条件判断一 ] && (||) [ 条件判断二 ]; then
执行内容程序
elif [ 条件判断三 ]
执行第二段内容程序
else
执行第三段内容程序
fi
在中括号[ ]里面的是条件表达式,如果是复合表达式的条件判断(如若A及B则C
之类的逻辑判断),那么就需要在两个中括号之间加上 && (and)或者是 || (or)这
样的逻辑表达式才行!如果是多重选择的话,那么就需要以 elif 来新增另一个条
件;如果所有的条件都不适用,则使用 else 来进行最后的执行内容!
注意:
在 [ ] 当中,只能有一个判断式;
在 [ ] 与 [ ] 当中,可以使用 && 或 || 来组织判断式;
每一个独立的组件之间都需要有空格键来隔开。
示例:

[root @test test]# vi test06.sh
#!/bin/bash
echo “Press y to continueread yn
if [ “$yn” = “y” ]; then
echo “script is running...” ;
else
echo “stop!" ;
fi
[root @test test]# sh test06.sh
Press y to continue
y
script is running...
[root @test test]$ sh test06.sh
Press y to continue
n
stop!
[root @test test]# vi test07.sh
#!/bin/bash
# This program is used to study if then
echo "Press y to continue"
read yn
if [ "$yn" = "y" ] || [ "$yn" = "Y" ]; then
echo "script is running..." ;
else
echo "STOP!" ;
fi
[root @test test]# vi test08.sh
#!/bin/bash
# set parameters in the if then
# 需要加上 hello 这个参数才会显示正确的。
if [ "$1" = "hello" ]; then
echo "Hello! How are you ?"
elif [ "$1" = "" ]; then
echo "You MUST input parameters"
else
echo "The only accept parameter is hello"
fi

条件判断二:使用 case …esac 的方式
case 输入方式(string) in
输入方式一)
程序执行段
;;
输入方式二)
程序执行段
;;
*)
echo “Usage: {输入方式一|输入方式二}”
exit 1
esac

输入方式(string)的格式主要有两种:

1、直接输入:就是以“执行文件 + 字符串 ”的方式来执行的, 字符串可以直接写成 $1 (在执行文件后面直接加入参数的第一个参数)
2、交互式:就是由屏幕输出可能的项目,然后让使用者输入,这个通常必须配合 read variable 然后 string 则写成 $variable的格式!

直接输入方式:

[test @test test]# vi test09.sh
#!/bin/bash
echo "This program will print your selection!"
case $1 in
one)
echo "your choice is one"
;;
two)
echo "your choice is two"
;;
three)
echo "your choice is three"
;;
*)
echo "Usage {one|two|three}"
exit 1
esac

交互方式:

[root @test test]# vi test10.sh
#!/bin/bash
echo "Press your select one, two, three"
read number
case $number in
one)
echo "your choice is one"
;;
two)
echo "your choice is two"
;;
three)
echo "your choice is three"
;;
*)
echo "Usage {one|two|three}"
exit 1
esac

循环结构语句
①for (( 条件一; 条件二; 条件三 ))
②for variable in variable1 variable2 …..
③while [ condition1 ] && { || } [ condition2 ] …
④until [ condition1 ] && { || } [ condition2 ] …

[test @test test]# vi test11.sh
#!/bin/bash
# Using for and loop
#
declare -i s
for (( i=1; i<=100; i=i+1 ))
do
s=s+i
done
echo "The count is ==> $s"
[test @test test]# vi test12.sh
#!/bin/bash
# Using while and loop
#
declare -i i
declare -i s
while [ "$i" != "101" ]
do
s=s+i
i=i+1
done
echo "The count is ==> $s"
[test @test test]# vi test13.sh
#!/bin/bash
# Using until and loop
#
declare -i i
declare -i s
until [ "$i" = "101" ]
do
s=s+i
i=i+1
done
echo "The count is ==> $s"
[test @test test]# vi test14.sh
#!/bin/bash
# using for...do ....done
#
LIST="Tomy Jony Mary Geoge"
for i in $LIST
do
echo $i
done
[test @test test]# vi test15.sh
#!/bin/bash
# Using for and loop to read the account of this li
nux server!
#
account=`cut -d ":" -f1 /etc/passwd | sort`
echo "The following is your linux server's accoun
t"
for i in $account
do
echo $i
done
[test @test test]# vi test16.sh
#!/bin/bash
# Using until
#
echo "Press Y/y to stop"
until [ "$yn" = "Y" ] || [ "$yn" = "y" ]
do
read yn
done
echo "Stop here"

综合示例:逻辑判断式
①先查看一下 /root/test/logical 这个名称是否存在;
②若不存在,则建立一个文件,使用 touch 来建立(建立的
是0字节的一个文件),建立完成后离开;
③如果存在的话,判断该名称是否为文件,若为文件则将之
删除后建立一个目录,目录名为 logical ,之后离开;
④如果存在的话,而且该名称为目录,则移除此目录!
⑤[test @test test]# vi logical.sh

#!/bin/bash
if [ ! -e logical ]; then
touch logical
echo "Just make a file logical"
exit 1
elif [ -e logical ] && [ -f logical ]; then
rm logical
mkdir logical
echo "remove file ==> logical"
echo "and make directory logical"
exit 1
elif [ -e logical ] && [ -d logical ]; then
rm -rf logical
echo "remove directory ==> logical"
exit 1
else
echo "Does here have anything?"
fi

综合示例:显示主机上的端口是否开启
[test @test test]# vi port.sh
主要代码:

ssh=`netstat -an|grep LISTEN|grep :22`
if [ "$ssh" != "" ]; then
echo "SSH is running"
else
echo "SSH is NOT running"
fi

四、linux中性能常用命令

• 说明:此部分内容大家可以看下我在第二次
视频讲解内容
• Iotop、netstat、lsof、iftop
• 。。。。。

五、sed和awk用法

sed
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作。
sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所
以不会修改原文件

Sed 语法格式
sed命令行格式为:
sed [常用选项] ‘常用命令’ 输入文本
• 常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都
会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动
作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的
sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。
• 常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)

c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)

p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法
!例如 1,20s/xiaoming/xiaowang/g 就是啦!
Sed 检索文件

Sed –n ’10 p’ data.csv 输出第十行文件内容Sed –n ‘99990,100000 p’ data.csv 输出99990到100000文件内容Sed –n ‘99990, $ p ’ data.csv 输出99990到文件末尾内容Sed –n ‘/xiaoming0/,/xiaoming10/ p’ data.csv 输出包含xiaoming0到
xiaoming10之间内容
• Sed –n ‘/^xiaoming p/’ data.csv ^表示文件开头
• sed ‘/xiaoming/!p’ data.csv 显示不含有xiaoming的行
• sed -n ‘/[^ xiaoming]/p’ data.csv 效果同上Sed ‘/^$/p’ data.csv 匹配文件空行
• /^.*$/  整行

Sed删除文件内容

• sed '10 d' aa.txt
• sed '10,$ d' aa.txt
• sed '10~20 d' aa.txt
• sed '/123/ d' aa.txt
• sed '/123/,$ d' aa.txt

Sed 替换文件

• [root@forest sh]# more data.csv100012  小明0  xiaoming0  1234567890  11111111111111110  杭州  0  0100013  小明1  xiaoming1  1234567891  11111111111111111  杭州  1  1100014  小明2  xiaoming2  1234567892  11111111111111112  杭州  2  2100015  小明3  xiaoming3  1234567893  11111111111111113  杭州  3  3100016  小明4  xiaoming4  1234567894  11111111111111114  杭州  4  4100017  小明5  xiaoming5  1234567895  11111111111111115  杭州  5  5100018  小明6  xiaoming6  1234567896  11111111111111116  杭州  6  6100019  小明7  xiaoming7  1234567897  11111111111111117  杭州  7  7100020  小明8  xiaoming8  1234567898  11111111111111118  杭州  8  8100021  小明9  xiaoming9  1234567899  11111111111111119  杭州  9  9100022  小明10  xiaoming10  12345678910  111111111111111110  杭州  10  10
• [root@forest sh]# sed -i's/\t/,/g' data.csv
• [root@forest sh]# more data.csv100012,小明0,xiaoming0,1234567890,11111111111111110,杭州,0,0100013,小明1,xiaoming1,1234567891,11111111111111111,杭州,1,1100014,小明2,xiaoming2,1234567892,11111111111111112,杭州,2,2100015,小明3,xiaoming3,1234567893,11111111111111113,杭州,3,3100016,小明4,xiaoming4,1234567894,11111111111111114,杭州,4,4100017,小明5,xiaoming5,1234567895,11111111111111115,杭州,5,5100018,小明6,xiaoming6,1234567896,11111111111111116,杭州,6,6100019,小明7,xiaoming7,1234567897,11111111111111117,杭州,7,7100020,小明8,xiaoming8,1234567898,11111111111111118,杭州,8,8100021,小明9,xiaoming9,1234567899,11111111111111119,杭州,9,9100022,小明10,xiaoming10,12345678910,111111111111111110,杭州,10,10

Sed 文件添加内容

• sed '$a insert one line data' data.csv200003,小明99991,xiaoming99991,12345678999991,111111111111111199991,杭州,255,65535200004,小明99992,xiaoming99992,12345678999992,111111111111111199992,杭州,255,65535200005,小明99993,xiaoming99993,12345678999993,111111111111111199993,杭州,255,65535200006,小明99994,xiaoming99994,12345678999994,111111111111111199994,杭州,255,65535200007,小明99995,xiaoming99995,12345678999995,111111111111111199995,杭州,255,65535200008,小明99996,xiaoming99996,12345678999996,111111111111111199996,杭州,255,65535200009,小明99997,xiaoming99997,12345678999997,111111111111111199997,杭州,255,65535200010,小明99998,xiaoming99998,12345678999998,111111111111111199998,杭州,255,65535200011,小明99999,xiaoming99999,12345678999999,111111111111111199999,杭州,255,65535
• insert one line data

• 相当于 echo “insert one line data” >> data.csv 文件尾部追加内容

  AWK
• awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理
如何执行awk
• 在LINUX的命令行上键入诸如下列格式的指令: ( “Shell)awk ‘awk程序’ 数据文件文件名
• 则awk会先编译该程序, 然后执行该程序来处理所指定的数据文件.
• (上列方式系直接把程序写在LINUX的命令行上)
• awk 程序的主要结构:
• awk程序中主要语法是 Pattern { Actions}, 故常见之awk 程序其型态
如下 :
• Pattern1 { Actions1 }
• Pattern2 { Actions2 }
• ……
• Pattern3 { Actions3 }
• Pattern 是什么 ?
• awk 可接受许多不同型态的 Pattern. 一般常使用 “关系表
达式”(Relational expression) 来当成 Pattern.
• 关系运算符(Relational Operators)
• >, <, >=, <=, ==, !=
• ~ (match) 及 !~(not match)
• 例如
• X > 10,X==Y
• “banana” ~ /an/
Actions 是什么?
• Actions 是由许多awk指令构成. 而awk的指令与 C 语言中的指令十分类似.
• 例如 :
• awk的 I/O指令 : print, printf( ), getline…
• awk的 流程控制指令 : if(…){..} else{..}, while(…){…}…
awk 如何处理 Pattern { Actions } ?
• awk 会先判断(Evaluate) 该 Pattern 的值, 若 Pattern 判断后的值为true (或不
为0的数字,或不是空的字符串), 则 awk将执行该 Pattern 所对应的 Actions.反
之, 若 Pattern 之值不为 true, 则awk将不执行该 Pattern所对应的 Actions.
例如 : 若awk程序中有下列两指令
• 50 > 23 {print “Hello! The word!!” }
• “banana” ~ /123/ { print “Good morning !” }
• awk会先判断 50 >23 是否成立. 因为该式成立, 所以awk将印出”Hello! The
word!!”. 而另一 Pattern 为 “banana” ~/123/, 因为”banana” 内未含有任何子字
符串可 match /123/, 该 Pattern 之值为false, 故awk将不会印出”Good
morning !”
• awk 的字段变量
• awk 所内建的字段变量及其含义如下 :
性能测试之linux
• awk 的内建变量(Built-in Variables)
• awk 提供了许多内建变量, 使用者于程序中可使用这些变量来取得相
关信息.常见的内建变量有 :
性能测试之linux
• 例如:awk 从文件 data.csv 中读入第一笔数据行
• 100012 小明0 xiaoming0 1234567890 11111111111111110 杭州 0 0
• 读取之后,程序中,

$0 之值将是
• $1 之值为
• $2 之值为
• $3 之值为
• $4 之值为
• $NF 之值为 8$NR 之值为 1$FILENAME 之值为

Awk工作流程
执行awk时, 它会反复进行下列四步骤:
1、自动从指定的数据文件中读取一个数据行.
2、自动更新(Update)相关的内建变量之值. 如 : NF, NR,
$0…
3、依次执行程序中 所有 的 Pattern { Actions } 指令.
4、当执行完程序中所有 Pattern { Actions } 时, 若数据文件
中还有未读取的数据, 则反复执行步骤1到步骤4.
awk会自动重复进行上述4个步骤, 使用者不须于程序中编
写这个循环 (Loop).

Awk字段变量使用

• awk -F\, '{print $1}' data.csv
• awk -F\, '{print $1,$2}' data.csv
• awk -F\, '{print $1" "$2}' data.csv
• awk -F\, ‘/99999/{print $0}’ data.csv等同于awk -F\, '$0~/99999/{print $0}'
data.csv
• awk -F\, '$1 ~ /999/{print $0}' data.csv
• awk -F\, '$1 !~ /999/{print $0}' data.csv
• 检索java进程PID
• ps -ef | grep java | grep -v grep |awk '{print $2}'

Awk内建变量使用

FS #改变字段切割的方式
awk 'BEGIN{FS="[,]";print "begin read file........"}{print $1,$2}END{print
"file read done"}' data.csv
BEGIN和END只执行一次
NR # awk已读入的数据行数目
NF #文件列总数
awk 'BEGIN{FS="[,]";print "begin read file........"}NR>99990{print
NR,NF,$1,$2}END{print "file read done"}' data.csv

Awk赋值、运算、比较
• 算术运算

awk 'BEGIN{FS="[,]";print "begin read
file........";i=0}NR>99990{i+=1;print
NR,NF+i,$1,$2}END{print "file read done"}' data.csv
i=0; 在BEGIN语句中赋值,初始化
i+=1;运算操作,等同于i=i+1;
NR>99990;比较运算
awk 'BEGIN{FS="[,]";print "begin read
file........";i=0}NR>99990&&$1>=200006{i+=1;print
NR,NF+i,$1,$2}END{print "file read done"}' data.csv

• 比较运算符:&& || != 与/或/不等于

Awk条件判

• If else
• awk 'BEGIN{FS="[,]";print "begin read
file........";i=0}{if(NR>99990||$1>=200006){i
+=1;print NR,NF+i,$1,$2} else {print
"NR<=99990||$1>=200006"}}END{print
"file read done"}' data.csvwk循环

• For循环
• awk '
• BEGIN{
• X[1]= 50; X[2]= 60; X["last"]= 70
• for( any in X )
• printf("X[%s] = %d\n", any, X[any] )
• }‘
• awk 'BEGIN{
for(k in ENVIRON)
{
print k"="ENVIRON[k];
}
}'
• While循环
• awk 'BEGIN{
total=0;
i=0;
do
{
total+=i;
i++;
}while(i<=100)
print total;
}'
• [aaa@qq.com sh]# cat data.dat
• 2000000001
2000000002
2000000003
2000000004
2000000005
2000000006
2000000007
2000000008
2000000009
• [aaa@qq.com sh]# sed '2,${s/^[0-9]/3/g}' data.dat
2000000001
3000000002
3000000003
3000000004
3000000005
3000000006
3000000007
3000000008
3000000009
• redis命中率:
• echo -ne "hits\tmiss\thit rate\n" >>aa.txt ;while true; do /usr/local/redis-
2.8.7/src/redis-cli info | awk -F':'
'/keyspace_hits/{hits=$2}/keyspace_misses/{printf "%5d %5d %.2f\n",
hits,$2,(hits/(hits+$2))*100}';sleep 2;done >> aa.txt