一.正则表达式

1.1国际字符模式匹配或匹配模式的类名

[:alnum:] : 0-9,A-Z,a-z
[:alpha:] : A-Z,a-z
[:upper:] : A-Z
[:lower:] : a-z
[:digit:] : 0-9
[:space:] : 空格或tab键

1.2基础正则表达式

^word:待查找的字符串在行首。
word$:待查找的字符串在行尾。
. :代表一定有一个任意字符的字符。
\ :转义字符,将特殊符号的意义去除。
* :重复0个到无穷多个的前一个字符。
[list]:从字符集合的RE字符里面找出想要选取的字符,在[]当中代表一个待查找的字符;
        例如:[afg]代表a或f或g的意思。
[n1-n2]:代表想要找出的字符范围;
        eg:[0-9]表示0到9;[a-z]代表a到z。
[^list]:找出不要的字符串或范围,即找出不含list中字符串的;
        eg:[^A-Z]:代表不要非大写字母;[^t]:不要字母t。
\{n,m\}:相当于{n,m}的转义,因{的转义为\{,因}的转义为\},表示连续n到m个前一个字符。
\{n\}:相当于{n},即表示重复n个前一个字符。
\{n,\}:相当于{n,},表示连续n个以上的前一个字符。
注:正则表达式的特殊字符与一般命令行输入命令的“通配符”并不相同。在通配符中*表示0到无限多个字符。但在正则表达式中,*则是0到无穷多个前一个字符。
eg:查找以a开头的文件名的两种实现:
通配符: ls -l a*
正则表达式:ls -l | grep '^a.*'

1.3扩张正则表达式

grep默认只支持基础正则表达式,如果使用扩展性表达式,可以使用grep -E,不过更建议直接使用egrep。egrep == grep -E。
+ :重复一个或一个以上的前一个RE字符。
    eg:egrep -n 'Go+d' a.txt
    即god,good,goood,...。
? :0个或1个的前一个RE字符。
    eg: egrep -n 'go?d' a.txt
    即gd,god,good,...。
| :用或(or)的方式找出数个字符串。
    eg:egrep -n 'gd|god' a.txt
    查找含gd或good的行。
():找出‘组’字符串
    eg:egrep -E 'g(la|oo)d' a.txt
    找出glad或good的行。
()+:多个重复组的判别
    eg:egrep 'A(xyz)+C' a.txt
    开头为A,结尾为C,中间位1一个以上的xyz字符串。

注:RE:regular expression(正则表达式)。

二.awk命令

2.1awk概述

互联网中对日志分析,大多使用的是Linux中的shell进行处理。此时主要使用的shell中的awk,因为awk强大的字段处理能力。下面就对其由浅入深,最后给出实例进行讲解。

首先给出一个很好的awk学习链接:http://www.cnblogs.com/chengmo/tag/awk/ 。

awk比较倾向于将一行分成数个“字段”来处理,其运行模式为:

awk '条件类型1{动作1} 条件类型2{动作2}...'   filename

注:awk主要是处理每一行的字段内的数据,而默认的字段的分隔符为空格键或tab键。

2.2awk入门

(1)eg: last -n 5 | awk '{print $1 "\t" $3}'

表示将登陆者的数据取出来,仅取前5行。其中$1表示当前行的第一个数据;$3表示当前行的第三个数据。

(2)awk是如何知道这个数据有几行几列呢?这需要下面的内置变量进行帮忙:

NF:每一行($0)的字段总数;NR:目前awk所处理的是第几行;FS:目前的分隔符,默认为空格键。

eg:在/etc/passwd当中是以冒号来作为字段分隔符的,该文件第一个字段为账号,第3个字段为UID,那下面要查询第3列小于10以下的数据,并且仅列出第一列与第三列,可以如下做:

cat /etc/passwd | awk ‘BEGIN{FS=":"} $3<10{print $1 "\t" $3}’

输出如下:

root 0

bin  1

注:BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。END:让用户在最后一条输入记录被读取之后发生的动作。

(3)有如下的薪资表pay.txt,内容如下:

Name   1st           2st        3st

Sean   23000    24000    25000

Zhao   21000    20000    23000

Bird2   43000    42000   41000

那如何格式化输出,并能计算每个人的总额呢?

如下考虑:第一行不需要加总,只是说明(NR==1);第二行以后,有加总(NR>=2)。

命令如下:

cat pay.txt | awk '{

if(NR==1)

printf  "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}

NR>=2{

total=$2+$3+$4

printf "%10d %10d %10d %10d %10.2f\n ",$1,$2,$3,$4,total }'

也可以这样:

cat pay.txt | awk 'NR==1{

printf  "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}

NR>=2{

total=$2+$3+$4

printf "%10d %10d %10d %10d %10.2f\n ",$1,$2,$3,$4,total }'

(4)如何查看一个文件的最后5行:tail -n 5 a.txt

如何查看有一个文件的前5行:head -n 5 a.txt

打印文件的行数:awk ‘END{print NR}’  data.txt

(5)如何查看一个文件夹下文件的个数

ls -l | awk 'END{print NR}'

注:表示处理完最后一行的时候,输出当前的NR,即文件的总行数。

(6)每4行转换成一行

awk '{if(NR%4==0){print $0}else{printf "%s",$0}}'  a.xml

2.3awk的实际应用

现在给出日志数据,只给出几行,如下所示:

23:59:59        bj      other   other1  detail  1       0       8178526912798594496654
23:59:59        ly       fang    fang1   list     34      2       7564641773641447038883
23:59:59        bj      fang    fang1   detail  1       0       4062479590911058005479
23:59:59        bj      fang    fang1   detail  1       0       7311067232020513225874

(1)awk统计日志中的pv和uv

pv表示页面的访问量,即刷新一次算一次访问。uv表示访客数,即访问这个页面的用户数。

下面实现统计该日志中的所有pv和uv,同时统计每一个大类(第三列数据)的pv和uv,shell如下所示:

[plain] view plaincopy
  1. #!/bin/sh
  2. if [ $# -lt 1 ]; then
  3. echo "Usage:"
  4. echo "      $0 [filename]"
  5. exit 1
  6. fi
  7. if [ "$1" == "-h" ]; then
  8. echo "Usage: $0 [filename]"
  9. exit 1
  10. fi
  11. awk -F"\t" '{
  12. total[$8] ++;
  13. uvlist[$3"#"$8] ++;
  14. if($5 == "detail")
  15. {
  16. detailpv ++;
  17. pvlist[$3] ++;
  18. }
  19. }END{
  20. print "total\t"detailpv"\t"length(total)
  21. for(k in uvlist)
  22. {
  23. split(k, c, "#");
  24. cate[c[1]] ++;
  25. }
  26. for(k in pvlist)
  27. {
  28. print k"\t"pvlist[k]"\t"cate[k];
  29. }
  30. }' $1

运行结果如下:

(2)awk从日志中统计在线率

这里统计是根据第二列(城市)和第三列(大类)进行统计的。shell如下:

[plain] view plaincopy
  1. #!/bin/sh
  2. if [ $# -lt 1 ]; then
  3. echo "Usage:"
  4. echo "      $0 [filename]"
  5. exit 1
  6. fi
  7. if [ "$1" == "-h" ]; then
  8. echo "Usage: $0 [filename]"
  9. exit 1
  10. fi
  11. cat $1 | awk -F"\t"  '$5 == "list"{
  12. if($2 != "bj" && $2 !="sh" && $2 != "gz" && $2 != "sz") next;
  13. citycategory = $2"_"$3;
  14. citymajor = $2"_"$4;
  15. if($3 == "fang")
  16. {
  17. ctotal[citymajor] += $6;
  18. conline[citymajor] += $7;
  19. }
  20. ctotal[citycategory] += $6;
  21. conline[citycategory] += $7;
  22. listall += $6;
  23. listonlineall += $7;
  24. }$5 == "detail"{
  25. if($2 != "bj" && $2 !="sh" && $2 != "gz" && $2 != "sz") next;
  26. citycategory = $2"_"$3;
  27. citymajor = $2"_"$4;
  28. if($3 == "fang")
  29. {
  30. dctotal[citymajor] += $6;
  31. dconline[citymajor] += $7;
  32. }
  33. dctotal[citycategory] += $6;
  34. dconline[citycategory] += $7;
  35. detailall += $6;
  36. detailonlineall += $7;
  37. }END{
  38. #按城市和大类一起统计
  39. cslen=asorti(ctotal,clA);
  40. print "<table border=\"1\"><caption align=\"top\">用户在线率统计</caption><tr><td>城市</td><td>类别</td><td>列表页总人数</td><td>列表页在线率</td><td>详情页总人数</td><td>详情页在线率</td></tr>";
  41. for(i=1; i <= cslen; i ++)
  42. {
  43. split(clA[i], arr, "_");
  44. dc = dct = "-";
  45. if(clA[i] in dctotal)
  46. {
  47. dct = dctotal[clA[i]];
  48. dc = dconline[clA[i]]/dct;
  49. }
  50. printf("<tr><td>%s</td><td>%s</td><td>%d</td><td>%.2f%%</td><td>%d</td><td>%.2f%%</td></tr>", arr[1], arr[2], ctotal[clA[i]], conline[clA[i]]*100/ctotal[clA[i]], dct, dc *100);
  51. }
  52. print "</table><br/><br/>";
  53. }'

三.grep命令

3.1grep概述

grep:进行字符的对比,将符合要求的字符打印出来。是以正则表达式搜索文本,并打印匹配行。grep是以整行为单位来进行数据的选取的。

其格式: grep [option] '正则表达式' 文件名

option: -n表示打印出时,显示行号;

-v表示反向选择,即不要符合正则表达式的行;

-A:后可加数字,为after意思,除了该行外,后续的n行也可列出。eg:-A3

-B:为before,除了该行外,前面的n行也可列出。

3.2grep入门

(1)查找特定字符串

grep -n 'the' a.txt :查找含the的行,并显示行号

grep -vn 'the' a.txt:查找不含the的行,并显示行号

grep -in ‘the’ a.txt:忽略the的大小写,查找含the的行,即the、The、tHe......

(2)查找字符集合,利用[]

grep -n 't[ae]st' a.txt :查找含tast或test的行

grep -n '[^g]oo' a.txt :oo前面不要出现g

grep -n '[^a-z]oo' a.txt :不想oo前面含小写的字母,等价于grep -n '[^[:lower:]]oo' a.txt
(3)行首与行尾字符^$

(a)grep -n '^[^a-zA-Z]' a.txt   :不要以字母开头的行

等价于grep -n '^[^[:alpha:]]' a.txt

注:^在[]之外表示定位在行首。^在[]之内表示“反向选择”。

(b)grep -n '\.$' a.txt:以.结束的行。因.表示任意字符,所以是特殊符号,需要转义。

(c)grep -n '^$' a.txt:找出哪些行是空行。

(d)grep -v '^$' a.txt  | grep -v '^#':不要空行和以“#”开头的行。

(4)任意一个字符.与重复字符*

grep -n 'g..g' a.txt  :表示g__g的字符

grep -n 'g*g' a.txt:g*表示一个空字符或一个以上的g,再加上后面的g。

grep -n ‘g.*g’ a.txt:表示g开头与g结尾。*表示0个或任意多个字符。

(5)限定连续RE字符的范围

因{}在shell中是有特殊意义的,因此我们必须用转义字符\来让它失去特殊意义才行的。

grep -n 'go\{2,\}g' a.txt:表示含2个以上的o。即good、goood、....

四.sed命令

4.1sed概述

sed常用于一整行的处理,主要对文件中的行进行操作。

其格式为:sed [-nefr] [动作]

动作说明:[定址] function

定址方式如下:
(1)n1[,n2]:表示n1到n2之间进行动作。eg:10,20[动作行为]
(2)/pattern/:模式(正则表达式)pattern指定的行
(3)/pattern/,/pattern/:2个模式(正则表达式)之间的行进行动作
(4)/pattern/,x:模式+行(在给定行号上查询模式)
(5)x,y/pattern/:通过行号和模式匹配行
(6)x,y!:不包含指定行号
(7)$:表示最后一行
注:范围可通过数值,正则表达式或者二者结合的方式确定。

fuction(即动作)如下:
(1)a:append(新增),在目前定址行的下一行插入字符串
(2)c:change(替换),替换当前定址到的行为字符串
(3)d:delete(删除),删除当前定址的行
(4)i:insert(插入),在定址行的上一行插入字符串
(5)p:print(打印),打印当前定址行的数据
(6)s:substitute(替换),其格式为:'s/要替换的字符串/新的字符串/g'

注:a、c、i动作之后,可以用空格或“\”隔开字符串

4.2sed入门

(1)以行为单位的新增功能
注:新增操作,结果到标准输出,不能被编辑,必须存到另一文件中。

在匹配行的下一行插入一行:
sed '/dreamb/a\appended line' a.txt :表示将含“dreamb”的匹配行后插入一行“appended line”
或 sed '/dreamb/a append line' a.txt
cat /etc/passwd | sed '2a drink tea':表示在第二行后追加一行“drink tea”
如果想保存修改,一般是重定向到另外的一个文件。

sed '/five/i four' a.txt > result.txt:表示含“five”的匹配行的上一行插入一行“four”
如果想直接修改源文件,可以用下面的命令:
sed -i '/five/i four' a.txt 
(2)修改文本
sed '3c\changed line' a.txt :表示在第三行替换为“changed line”
等价于sed '3c changed line' a.txt
(2)删除文本
sed '1,3d' a.txt:删除1到3行
sed '/dreamd/d' a.txt:删除含“dreamd”的行
sed -n '/Begin/,/End/d' a.txt | more:删除两个匹配行之间的数据
sed '$d' a.txt:删除最后一行
sed '/^th/d' a.txt:删除以th开头的行
(3)替换
替换格式:sed '[address[,address]] s/pattern_find/replacement_pattern/[g,p,w,n]' filename

其中,g表示对模式空间中的所有情况进行替换,默认只替换首次出现的模式。
sed '1,2 s/d$/&dd' a.txt:将1-2行中的所有以d结尾的行,都附加上一个dd
sed '/first/ s/st/ST/' a.txt:将含有“first”的行中st换成大写ST
cat /etc/man.config | grep 'MAN' | sed 's/#.*$'//g':表示删除掉“#”批注之后的数据
(4)转换文件
通常用于大小写的转换
语法为:y/abc/xyz/
sed 'y/five/six1' a.txt:将five转换成six1
(5)显示匹配行
sed -n '5,7p' a.txt:显示a.txt中的5-7行
等价于head -n 7 | tail -n 3:即前7行中的后3行

转自:http://blog.csdn.net/lianxiang_biancheng/article/details/8679622

转载于:https://www.cnblogs.com/RandomRand/p/7403902.html

Linux中正则表达式与文件格式化处理命令(awk/grep/sed)相关推荐

  1. Linux中3个文件查找相关命令

    1.which命令 我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which  查看可执行文件的位置. whereis 查看文件的位置. locate   配 ...

  2. linux打开文件命令_详解Linux中3个文件查找相关命令

    来自:民工哥技术之路 1.which命令 我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which  查看可执行文件的位置. whereis 查看文件的位置. ...

  3. Linux中查看各文件夹大小命令du -h --max-depth=1

    du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>] [--max-de ...

  4. linux 中 chmod设置文件权限的命令

    chmod是Linux下设置文件权限的命令,后面的数字表示不同用户或用户组的权限. 一般是三个数字: 第一个数字表示文件所有者的权限(User u) 第二个数字表示与文件所有者同属一个用户组的其他用户 ...

  5. Linux之旅 9:正则表达式与文件格式化

    Linux之旅 9:正则表达式与文件格式化 (图片来自常用正则表达式) 什么是正则表达式 正则表达式(简称为正则)可以看做是一种微型标记语言,通过定义一系列符号来灵活地设定一种匹配模式,对目标字符串进 ...

  6. Linux学习-鸟哥-第十一章-正则表达式与文件格式化处理

    正则表达式与文件格式化处理 一.基础正则表达式 1.grep 的高级选项 2.基础正则表达式练习 3.基础正则表达式字符集合 4.**sed**工具 二.扩展正则表达式 三.文件的格式化与相关处理 1 ...

  7. linux中用zip压缩文件,详解Linux中zip压缩和unzip解压缩命令及使用详解

    下面给大家介绍下Linux中zip压缩和unzip解压缩命令详解 1.把/home目录下面的mydata目录压缩为mydata.zip zip -r mydata.zip mydata #压缩myda ...

  8. linux中zip文件解压命令,Linux中zip压缩和unzip解压缩命令使用方法

    Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统.在Linux中,我们可以利用命令进行文件压缩,即zip压缩和unzip解压缩,这篇文章主要介绍了详解Linux中zi ...

  9. linux mysql命令行导入_在linux中导入sql文件的方法分享(使用命令行转移mysql数据库)...

    因导出sql文件 在你原来的网站服务商处利用phpmyadmin导出数据库为sql文件,这个步骤大家都会,不赘述. 上传sql文件 前面说过了,我们没有在云主机上安装ftp,怎么上传呢? 打开ftp客 ...

最新文章

  1. Ubuntu 14.04上使用CMake编译MXNet源码操作步骤(C++)
  2. 关于jetbrains系列产品2018.1.5以后的使用(crack)方法
  3. Android 4.2.2原生Launcher修改使之可以运行过程小结
  4. 【阿里云课程】生成模型之GAN优化目标设计与改进
  5. mysql用reader读取空数据时报错的处理
  6. java请求菜鸟快递接口返回乱码
  7. 服务器搬迁方案_定稿某信息中心机房搬迁方案实施实施方案计划_项目可行性方案(样例3)...
  8. 网络迷踪常用网站工具汇总(采集意见版)——炒饭论坛
  9. python进行EXCEL表格自动填充
  10. MzTreeView节点树(梅花雪)
  11. python xlrd获取excel行数_Python 使用xlrd库读取excel,获取最大行和最大列等
  12. 将一个大文件分割为若干个小文件的方法
  13. 优质短视频内容有哪些特质?不要迷信爆款,通俗易懂很重要
  14. 2021年中国5G手机发展现状及市场竞争格局分析:华为持续领跑国内5G手机市场[图]
  15. 如何提升程序员的代码编写能力
  16. 将图片压缩至指定大小Kb(Thumbnailator)
  17. shell 十三問 lt;转gt;
  18. 阿里刘振飞:我们用了10年,从去IOE到OceanBase世界第一!
  19. 微信小程序开发工具模拟器不显示鼠标问题【推荐两方案】
  20. 6U CPCI平台学习资料第116篇:基于5VLX110T FPGA FMC接口功能验证6U CPCI平台

热门文章

  1. 如何用qt实现学生信息管理系统
  2. Python简单实现图像融合
  3. 如何管理计算机中文件,如何管理电脑文件
  4. WebAPI 网站发布
  5. 【云贝学院】揭秘TDSQL分布式实例扩容的逻辑流程
  6. SpringBoot部署子工程java -jar启动时报错:xxxxxxx.jar中没有主清单属性
  7. 笑谈XML,xsd与xsl文件的区别
  8. 市场调研报告-全球与中国熔接器市场现状及未来发展趋势
  9. Sklearn-GBDT(GradientBoostingDecisonTree)梯度提升树
  10. 央视影音大屏版apk下载_cboxtv_2.2.0(央视影音大屏版).apk