现在的位置: 首页 > 搜索引擎优化 > 正文

Linux shell脚本网站日志分析常用基础命令

2013年11月04日 搜索引擎优化 ⁄ 共 9966字 暂无评论 ⁄ 阅读 1,187 次

【文本编辑】

grep

搜索文本,它的全称是“global search regular expression and print out the line”,即为全面正则搜索并输出,它基于正则表达式(可见正则表达式相关内容)搜索,是服务器日志分析中最常用的命令,没有之一!

语法:grep [options] [pattern] [file]

options,选项,指定搜索的方式,如仅显示行数、忽略大小写等;pattern,模式,可指多种,如正则表达式、关系表达式等;file,文件,指定搜索的文件,可为一个可为多个。

常用选项:-c(只输出匹配行的数量),-i(忽略大小写),-h(查询多文件时不输出文件名),-n(在输出匹配行前加行号),-l(只输出匹配的文件名不输出匹配行),-s(不显示不存在或未匹配的错误信息),-v(输出所有不匹配行),-w(以整词匹配),-x(以整行匹配),-r(递归搜索,不仅搜索本目录,而且搜索所有子目录),-E(支持扩展正则,常用扩展元字符包括三个,“?”出现0或1次,“+”至少出现1次,“|”表示“或”),-F(不支持正则)。

搜索样式:若搜索样式中有空格则必须使用双引号,否则将把第一个字符串后所有内容作为检索文件。搜索样式最好使用双引号,若使用单引号在存在变量时将不解析变量,若不使用引号则会先解析变量、命令然后输出内容。一般在无变量时使用单引号,在有变量时使用双引号。搜索样式若需要逻辑符“或”则可以使用egrep或grep -E模式在样式中添加正则逻辑符|(或)。

搜索文件可批定一个或多个,文件之间用空格隔开,还可以使用统配符*?+[]等指定文件。

举例

grep -n '^$' *                                                          在当前目录所有文件中搜索空行并显示行号输出
grep 'house365\.com' sell.log                                     在sell.log文件中搜索house365.com并输出
grep -h 'house365\.com' sell.log rent.log                     在sell.log和rent.log中搜索house365.com仅输出含匹配行的文件
grep -c 'sell' sell*.log                                                 在以sell开头的log文件中搜索sell的匹配行数量并输出
grep -E 'sell/info|rent/info' sell* rent*                          在以sell或rent开头文件中搜索含sell/info或rent/info的行并输出

sed

替换、删除、新增、选取等,英文名称stream editor,流编辑,它可以将一系列命令用于一批文本文件的处理。sed在缓冲区处理数据并在屏幕输出,并不编辑原始文件,若需要保存文件则需进行重定 向输出。sed命令在文本编辑中很常用,然而,在服务器日志分析中并不太常用,但理解该命令有助于理解下面很重要的awk命令,故置于此处来讲。

语法:sed [option] [commands] [file]

sed [option] -f sed脚本文件 输入文件  (sed脚本命令,本处不讲)

./sed脚本文件 输入文件  (sed脚本命令,本处不讲)

option(常 用选项),sed常用选项有四个,-e(表示下面为sed编辑命令,当仅有一个命令时可省略-e,sed不支持多命令必须一个-e后一个sed编辑命令。 sed编辑命令中的{}符号也可以在指定行上执行多个命令,命令之间使用;符号隔开,非同一指定行多编辑命令可直接用分号隔开而省略了-e选项。在部分版 本shell中还可通过sed '再按下Enter键,shell将出现>二级命令提示符,在此可输入多编辑命令,最后一条命令后跟'结束输入),-i(直接修改读取的文件内容, 而不是在屏幕输出),-n(安静模式,不在屏幕显示所有行,仅显示经sed处理的行),-f(表示下面为调用sed脚本文件)。

command(sed命令),sed命令通常由定位文本行和sed编辑命令两部分组成,sed编辑命令对定位文本行进行处理。

sed有两种文本定位方式:指定行号或正则表达式。

linux sed命令文本定位方法

sed 常用编辑命令d(删除),a(定位行下行新增,不指定行则在每行后添加),i(定位行上行新增),p(屏幕输出匹配行),c(新文本替换定位文 本),s(pattern(注:多指正则)替换pattern,其后跟g表示全面替换,跟w则为替换后的内容指定输出重写向文件。s命令也可通过 s/pattern//g实现删除命令,即第二个pattern为空即可,与d不同的是,d删除的是匹配行,而s则是对行中的字段进行删除),=(输出匹配行行号),n(定位到定位行下行位置,通常配合{}进行多编辑命 令)。

举例

sed -n '2,4p' sell.log                                                         仅输出sell.log中第2到4行
sed -n '/house365\.com/p' sell.log                                     仅输出sell.log中包含house365.com的行
sed -n -e '/house365\.com/=' -e '/house365\.com/p' sell.log 先输出sell.log中匹配行(house365.com)行号,再输出匹配行
sed -n '/house365com/{=;p}' sell.log                                 与上条命令结果相同,只是使用{}进行多命令编辑
sed -n '2,4!p' sell.log                                                       不输出第2到4行
sed -n '/^house365\.com/,5p' sell.log                                仅输出以house365.com开头行到第5行的行
sed '2,$d' sell.log                                                             删除第2到最后一行,注,该删除仅处理缓冲区不处理原文件
sed -i '/rent/d' sell.log                                                      直接在sell.log中删除包含rent的行
sed '1a house365.com' sell.log                                          在第一行后追加house365.com,注,a\与a空格相同
sed '1,3a house365.com' sell.log                                       在1到3行每行后追加house365.com
sed '3a house365.com\nsell.house365.com' sell.log              在第3行后追加两行,注,多行追加用\n换行符
sed '1,3c house365.com' sell.log                                       将第1到3行替换成house365.com
sed '/house365\.com/c sell.house365.com' sell.log               查找house365.com并将之替换为sell.house365.com
sed -n 's/house365com/house365\.com/pg' sell.log             查找housecom并替换为house365.com,注,若无-n则将完全展示文件内容,若无p则不输出,在正则替代正则时n和p一般成对出现;g为全面替换,若无g则每行只替换第一次匹配
sed -n 's/house365com/house365.com/2p' sell.log              每行中第2次出现的house365com替代为house365.com
sed -n 's/house365com/house365.com/gw sell2.log' sell.log  将house365com替换并将替换后内容输入sell2.log
sed '/sellhouse/{n;s/rent/sell/g;}' sell.log                            定位sellhouse行并将其下行的rent替换为sel

awk

awk是一种可以基于指定规则查找和抽取信息的文本处理工具,它甚至可以进行数据、函数(条件、循环、判断)等处理工作。awk可称得上是结构化数据处理的神器,由于服务器日志是典型的结构化数据,故网站日志分析中很常用。

理解awk编程模型有助于学习awk编程,awk程序由一个主输入循环(main input loop)维持,主输入循环反复执行,直到终止条件被触发。主输入循环无需自写,awk已搭好主输入循环框架,程序员写的代码被嵌到主输入循环框架中执行。主输入循环自动依次读取文件行以供处理,而处理文件行的动作由程序员添加。

awk还定义了两个特殊的字段:BEGIN和END,BEGIN用于在主输入循环之前执行,即在未读取输入文件行之前执行,END则相反,用于在主输入循环之后执行,即在读取输入文件行完毕后执行。我们可以简单地将awk编程模型分为三个阶段:读取输入文件之前的执行代码段(由BEGIN关键字标识)、读取输入文件时的执行代码段、读输入文件完毕之后的执行代码段(由END关键字标识)。BEGIN和END不参与文本行的处理,只是做一些初始化、全局变量设置和善后的工作。

awk编程模型

语法:awk [-F 域分隔符] [commands] [file]

awk -f awk脚本文件 输入文件 (awk脚本命令)

./awk脚本文件 输入文件 (awk脚本命令)

任何awk语句(即语法中的commands)都由模式(pattern)和动作(action)组成。模式用于测试行是否需要执行动作,相当于sed中的定位;动作是包含语句、函数和表达式的执行过程,相当于sed中的命令。模式决定何时触发动作和事件,动作执行对输入行的处理。两者是可选的,如果没有pattern,则action应用到全部记录;如果没有action,默认输出整行。

关于pattern,模式可以为:/正则表达式/、关系表达式(如$2==num,$3>num等,可是数字或字符串的比较)、模式匹配表达式(即,先指定域,再在域中进行正则匹配等,用运算符~和!~)、模式,模式(指定行范围)

awk支持?和+正则元字符,而grep和sed并不支持。先用一个例子来辅助理解模式和动作:

awk '/^$/{print "this is a blank line."}' input

很类似于sed命令,单引号之间的是commands内容,commands全两部分,先定位,再处理,双斜线/pattern/相当于sed里的定位,后面花括号相当于多命令组合,有木有!其中pattern里的^$在正则中表示空行,input是输入文件。

对上面的例子,再用脚本演示一下。首先需要先写awk脚本,脚本第一行要加sha-bang符号,脚本内容为:

#1.awk:替代空白行
#! /bin/awk -f
/^$/{print "this is a blank line."}

执行代码有两种写法,如下:

awk -f 1.awk input
./1.awk input

awk可对列进行操作,我们来熟悉下“列操作”中的基本概念。awk认为输入文件是结构化的,它将每个输入文件行定义为记录,行中每个字符串定义为域,域之间用空格、tab键或其他符号等进行分隔,分隔域的符号叫做分隔符。

awk定义域操作符$来指定执行动作的域,域操作符$后面跟数字或变量来标识域的位置。$0表示全部域,即整行。域操作符$后面可跟变量,或者变量运算表达式,举例:

awk 'BEGIN {one=1;two=2} {print $(one+two)}' input         

定义变量one、two的值分别为1、2,变量运算one+two=3即输出input中第3个域。

awk默认域分隔符为空格等,我们可以通过-F(小写-f表示调用脚本)改变分隔符,也可以利用环境变量FS与BEGIN字段定义,举例:

awk 'BEGIN {FS=","} {Print $2}' input

BEGIN语句中将FS赋值为逗号,并从input中抽取第二个域输出。同样,我们可以使用正则将分隔符设置为多个字符,举例:(1)FS="\t" (2)FS="\t+" 对于记录a\t\tb,(1)将之解析为三个域:a、空域、b,(2)将之解析为两个域:a和b。

关键运算符,awk模式匹配中可运用关键运算符,包括:<(小于),>(大于), <=(小于等于), >=(大于等于),==(等于,切记,一个=是变量赋值),!=(不等于,!在前),~(后若跟//表示域中正则匹配,若为变量~数字形式,则意为模糊匹配,即包括该数字则匹配如20或匹配1202),!~(域中不正则匹配)。

布尔运算符,||(逻辑或),&&(逻辑与),!(逻辑非)。

运算符,+-*/(加减乘除),%(模),^或**(乘方),++x(在返回x值之前,x变量加1),x++(在返回X值之后,x值加1),x+=y(x=x+y),x-=y(x=x-y),x*=y(x=x*y)。

awk表达式用于存储、操作和获取数据,一个awk表达式可由数字、字符常量、变量、操作符、函数和正则表达式自由组合而成。变量是一个值的标识符,它只能包含数字、字母和下画线,且不能以数字开头、大小写表不同变量,变量初始值为0或空字符串。

举例:

awk 'BEGIN {FS=":"} $1~/root/'   test.txt

awk '{if($9==301) print $0}' sell.log                      若第九个域等于301,则输出整行

假设sturecord文件中记录学生考虑成绩,其中2-6为2年级6班,成绩分别为语数外理化生,记录如下:

Zhang San,2-6,82,88,92,83,90,77
Li Si,2-2,92,73,91,81,68,84
Wang Wu,2-3,86,80,89,79,81,90

想知道他们总成绩及平均成绩,则可编写如下sr.awk脚本:

#! /bin/awk -f
BEGIN {FS=","}
{total=$3+$4+$5+$6+$7+$8
avg=total/6
print $1,total,avg}

执行代码如下:

./sr.awk sturecord

系统变量,awk有两种系统变量,第1种用于改变awk的默认值,如域分隔符;第2种用于定义系统值,在处理文件时可读取这些系统值,如记录中域数量、当前记录数等,awk动态改变第2种系统变量的值。

常用的系统变量有:$n(第n个域,域由FS分割),$0(所有域),FS(字段分隔符,默认为空格),RS(记录分隔符,默认空格),OFS(输出域分隔符,默认空格),ORS(输出记录分隔符,默认换行),NF(当前记录中域的数量),NR(当前记录数),FILENAME(当前文件名)。

格式化输出,printf (格式控制符,参数),格式控制符以%符号开始。格式控制符分修饰符和格式符两种,常用修饰符有:-(左对齐),width(域的步长),.prec(小数点右位数);常用格式符有:%s(字符串),%d(整型数),%f(浮点数)。

内置字符串函数,gsub(r,s,t)在t域(若无t表示$0)内将r(可为正则),替换为s(或为字符串需双引号);sub与gsub相似,只是它仅替换模式r在记录中出现的第一个位置。

条件语句与循环语句,条件语句if (条件表达式) action1 else action2;循环语句有三种,while、do while和for,while (条件表达式) action,do action while (条件表达式)。

举例:

awk '/\/ HTTP/' sell.log
# awk默认print全行,故在全行时pattern后的action可省略,本例与grep '\/ HTTP'相同,强大的awk,可替代grep的作用!
awk '/[Ss]un/,/[Mm]oom/ {print}' input
# pattern之间用逗号表示匹配的范围,全行输出时可省略$0;显示第一个Sun或sun和第一个Moom或moon之间的行
awk -F ':' 'print $1\t$2' input                         在输入文件中,以:为域分隔符,输出第1和2个域,域之间以tab键分隔
awk -F ':' 'BEGIN {print "URL\t响应码"} {print $2\t$5}' input      在输出文件前加URL和响应码   
awk '$7 ~/\/$/ {print}' sell.log                       在sell.log中,若第7个域中匹配以/结尾,则输出全行
awk '$9!=200' sell.log                                   在sell.log中,若第9个域不等于200则输出全行,此处省略action的print
awk '$9==404 {print $0 > "404.log"}' sell.log  若第9个域等于404则将全行输入404.log,注:文件名外需加双引号
awk '{ i = 1; while ( i <= NF ) { print i,$i; i++}}' sell.log             输出域号及域的记录,注:当域较多时用于辨别域号
awk '{for (i = 1; i<=NF; i++) print i,$i}' sell.log                         与上条命令相同
awk '{sum += $10};END {print sum}' sell.log                           对第10个域求和
awk '$9==200 {sum += $10};END {print sum}' sell.log            当第9个域等于200,对第10个域求和

sort

排序,可对记录进行排序,且可将记录分成多个域并按域进行排序,默认域分隔符是空格。sort在网站日志分析中很常用,它是去重命令uniq的前提条件。

语法: sort [option] [file]

常用选项:-n(按数字大小进行排序,sort默认按字符串排序,它以行为单位从首字符向后,按ASCII码值进行一一比较,最后按升序输出,ASCII值中数字<大写字母<小写字母),-r(逆序排序,即降序),-t(改变域分隔符,注,与awk不同,-t后直接跟域分隔符而没有空格,注,指定分隔符后空格将以ASCII码有意义存在),-k(按指定域排序,-k后直接跟指定域数,域数后跟.num指按该域的第num个字符开始排序),-u(去除排序结果中的重复行),-o(指定输出文件,sort命令默认将排序结果输出到屏幕),-f(小写转大写后排序),-c(检查是否排序好了,未排序则输出错误排序,已排序则不输出内容)。

uniq

去重,连续行重复去重,一般情况下使用之前必须对记录进行sort。在网站日志分析中,uniq非常常用,一般前后均跟sort进行使用,先排序再去重,再按重复次数排序。

语法:uniq [option] [file]

常用选项,-c(在每行输出前加本行在文件中重复次数),-d(只输出重复行,且每重复行仅输出一次),-u(仅输出未重复行)。

常用应用方式“... | sort | uniq -c | sort -nr”表示,去重并按重复次数降序输出。

wc

统计,用于统计文本行数、字数、字符数。在网站日志分析中,经常于最后用于统计。

语法:wc [option] [file]

常用选项:-l(统计文件行数),-w(统计单词数),-c(统计字符个数),当无选项时则依次输出这三项,即行数、词数、字符数。

head&tail

读取文件开头(head)或结尾(tail)的特定行,默认不指定时显示10行,在日志分析中head会常被用到提取前n前。

语法:head [option] [file]

常用选项:-num(指定头num行,与-n num等价),-n num(指定头num行),-c num(指定前num字节内容)。

【文件操作】

cat

读取显示,与more命令相似,在日志分析中常用,可合并文件。

语法:cat [option] [file]

常用选项:-n(从1开始对所有输出行编号),-b(从1开始对所有输出行编号,但对空白行不编号),-s(连续两行及以上空白行替换为一行空白行)。

cat还可用于创建文件,合并文件。创建文件直接cat > filename即可,合并文件语法为cat file1 file2 > file。

cd

目录切换

语法:cd [directory]

常用命令:[cd ..]上级目录,[cd ../..]上两级目录,[cd or cd ~]登录目录(即为用户或系统设置的默认目标,一般为home/主机名/目录),[cd -]上次访问的目录,其中单一.可表示当前目录,若不能确定当前目录,可直接输入pwd即可显示当前目录路径。

ls

列出,常用选项-l(详细信息)

语法:ls [option] [file or directory]

cp

复制,常用选项-i(覆盖询问)

语法:cp [option] [source] [destination]

mv

移动或重命名,常用选项-i(覆盖询问)

语法:mv [option] [source] [destination]

rm

删除,常用选项-ri(询问式删除)/rf(非询问删除)

语法:rm [option] [flie or directory]

mkdir

目录创建,常用选项-p(按路径创建)

语法:mkdir [option] [directory]

rmdir

目录删除,仅能删除空目录,若目录下存在文件则需用rm -ri或-rf

find

查找,常用选项-name(根据文件名查找),-type d/f(目录/文件)

语法:find [路径] [opition] [操作],操作命令-print(输出)、-exec/-ok(执行后续shell命令),逻辑操作-a(and)、-o(or)、!(not),举例:

find . -name "*.log" -print                                     在当前目录中查找.log文件并输出显示
find . -name "sell*" -print                                      在当前目录中查找以sell开头的文件并输出显示
find . -name "sell*" -print -o -name "rent*" -print      在当前目录中查找以sell或rent开头的文件并输出显示
find . \( -name "sell*" -o -name "rent*" \) -print       与上句同义,当使用逻辑符时可以用使用转义后的括号括起来

find可与grep、cp、rm等的结合使用,-exec或-ok后可跟shell命令,命令形式为[-exec '命令' {} \;],其中,{}表示命令的参数即为所找到的文件,命令必须以[\;]结尾,而\;与之前的}之间必须有空格。 -ok命令与-exec命令不同的地方在于,它会在执行命令时进行询问。举例:

find . -name "sell*" -exec grep 'sell' {} \;               在当前目录中查找以sell开头的文件,并从中抓取包含sell的行显示
find . -name "sell*" -exec cat {} \;                        在当前目录中查找以sell开头的文件,并将查看文件内容

有时,当-exec处理的队列过长会出错,此时需要用xargs将队列转换成小块分段传递给命令,举例:

find . -name "sell*" | xargs grep "sell"                  在当前目录中查找以sell开头的文件,并从中抓取包含sell的行显示

【符号类】

>和>>

I/O重定向中常用的符号,

> file表示将输出重定向,不在屏幕上输出,而是输出到该符号后的文件中,若该文件存在则将替换原内容,若不存在则将创建新文件。

>> file表示将输出输入flie文件原内容后,而不替换原内容。

tee file表示将输出输出到flie中,同时在屏幕打印结果。

|

管道,管道是linux的一种基本进程间通信技术,它利用先进先出的排除模式来指挥进程间的通信。

语法:command1 | comand2 | ... | comands

Shell在处理中会将command1的输出发送给command2进行处理,依次传递。

‘’和“”

引号,引号可以防止特殊字符被shell脚本解释为其他意义。数值型变量外加双引号和不加一样,但对于字符串型变量,加双引号可以防止字符串分割、保留变量中空格。单引号是绝对引用,将保持引号内的所有特殊字符不被翻译。另外,有些命令中,已经指定使用某种引号。

 

» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!

给我留言

留言无头像?