`
jupiterpan
  • 浏览: 20666 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

grep,awk,sed 简单小结

阅读更多

本文谢绝任何形式的转载,谢谢~

 

Linux下有众多shell命令,合理的利用可以简化工作、提升效率。
日志分析始于文本处理,与之相关的最为重要的命令个人首推grep、awk、sed~ 

 

GREP

相较于awk和sed,grep在日常工作中的应用更为普遍,使用频度颇高的命令组如"ps –ef | grep  ***”,
从该命令组不难看出,grep具有文本过滤的能力。

Grep诞生以来有三个大的分支,Linux下该命令则几乎涵盖了所有分支的功能。
详细全面的介绍可以参阅相关文档,在这里,我想着重提一下 -m, -h以及-c。

 -m 这是一个非常实用的功能,当我们只需要检查是否存在满足匹配,可以使用该参数;当达到限定数目后,则遍历中止。
 -h 检索多文件时,结果集默认会显示文件名,这在有些场合并不必要甚至多余,使用该参数可以满足需求。
 -c 效果相当于 “grep *** | wc –l”,效率大大优于前者;事实上,应当避免使用 "...|grep xxx|wc -l"这类低效操作。 

最后值得一提的是,grep命令具有返回值,这在编写自动化脚本时有一定的使用价值。 

相关测试代码:

[zhongming@oser116 ~]$ cat testGrep
a
a
a
a
b
b
b
[zhongming@oser116 ~]$ grep a testGrep
a
a
a
a
[zhongming@oser116 ~]$ grep -m 1 a testGrep
a
[zhongming@oser116 ~]$ grep -m 1 a testGrep testGrep
testGrep:a
testGrep:a
[zhongming@oser116 ~]$ grep -h -m 1 a testGrep testGrep
a
a


 

AWK

Awk不只是个命令,它还是一门编程语言,其高效和强大已经为历史所证明。
Awk的特别在于,你可以用它简单的写上一行完成一段逻辑,也可以用它构建出成百上千(当然可以更多)行的复杂工程。
Awk让人称道的是它的高效,曾有资深的专家试图使用C语言重新实现awk的功能,结果数万行的代码运行结果,效率提升微乎其微~ 

在这里,和其后的sed一样,本文不拟也不可能对awk作出完整的介绍,但即使是其最简单的应用,也能够为我们日常工作提供极大的便利。 

Awk基本语法和常用参数:

 

awk '{pattern + action}' {filenames}

Usage: awk [POSIX or GNU style options] -f progfile [--] file ...

POSIX options:          GNU long options:

        -f progfile             --file=progfile         独立成文件的脚本体

        -F fs                   --field-separator=fs   字段拆分符(集)

        -v var=val              --assign=var=val      外部变量传递
 

 

  

Awk常用内置参数:

变量  描述
$n   当前记录的第n个字段,0时显示所有
FILENAME 当前处理文件名
FNR 当前文件已处理的记录数
NR 已处理的记录数
NF 当前记录字段数
$array$ 自建数组,名称自定义

 以上抽列了awk最基本的命令参数和内置参数,简单做下说明:
-f  简而言之就是将’’之间的script主体独立成文件持久,可以实现脚本的复用,任何编程语言都会应用此理念,不必多言。
-F 最最基础的参数,支持正则表达式,可以指定单个或多个分隔字符。
-v awk中引用外部变量的诸多方法中,最为直观,最具美感的一种方式,需要指出的是,一组变量紧跟一个-v。
NF 返回当前记录在拆分规则下的字段数。
$n 有效范围是所有不大于NF的自然数,其中$0表示整条记录;顺带说一下,awk中内置或者自建的数组,下标都从1开始编号。
FNR/NR 理解这两个参数的关键在于理解awk的工作机制——行(记录)处理模式:
       awk对文本按记录拆分规则(默认为行)逐次处理,在处理多文件时,FNR和NR则会出现差异,
       利用这一差异可以实现自动化处理,下面的例子可以参考。
FILENAME,返回当前处理文件名,对应命令行中的文件输入,输出报表时有一定的应用价值。
$array$,自定义的数组,awk中的数组支持字符串的下标,可以近似理解为HASH。 

        `awk -F '\t' -v len=$pool_len -v ver=$list_ver'
        FNR==1{i++}index($1,ver){
                if(i<=len){a[$2]=1}
                else if(i==len+1){
                    if(!b[$2]&&!a[$2]){
                        new++;
                        b[$2]=1;
                    }
                }else if(i==len+2){
                    if(!c[$2]&&!a[$2]){
                        lost++;
                        c[$2]=1;
                    }               
                }
        }END{
                print new+0,length(b),lost+0,length(c)
        }' ${file_list[@]:1:$pool_len} ${file_list[0]} ${file_list[$((pool_len+1))]}`

此为一脚本片断,截取了主体逻辑的awk部分,片断外定义了数组file_list和变量pool_len。
其中file_list存放了待处理的文件列表,pool_len为可定制的池长度。处理逻辑为:
遍历所有文件,构建UID池,对新进日和流失日中不属于池的UID进行计数,遍历结束后输出计数。

“FNR==1{i++}”的作用为每一个处理的文件进行编号,从而根据编号(可以理解为文件列表中的次序)实现不同的处理逻辑。
这个用法并不严谨,不过在本问题里,风险是可以预见和规避的。

有关FNR,更为常见的应用是和NR结合,区别待处理的两个文件,代码形如:NR==FNR{…}NR>FNR{…}。 

最后,目前网上通行的awk示例多为文本合并或比较,此处不再重复,本质上这类问题的处理原则为:
抽取共有的部分为KEY做为自建数组的下标,需要比较或变更的值做为Value,按实际的需求组合逻辑、操作数组即可。

 

 

 SED

和awk一样,Sed处理机制也为行模式(多行模式本文不拟涉及)。调用形式和awk类似

Sed基本语法和常用参数:

 

sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
  -e script, --expression=script 允许多台编辑
  -f script-file, --file=script-file 同awk该参数
  -n, --quiet, --silent  静默模式,输出结果须显示指定(p)才打印,
  -i[SUFFIX], --in-place[=SUFFIX] 处理结果修改至原文件
  -r, --regexp-extended 使用扩展的正则表达式

常用Command列表:

 

d 从模板块(Pattern space)位置删除行。
n 读取下一个输入行,用下一个命令处理新行。
p 打印模板块的行。
q 退出Sed。
=  打印当前行号码。
s/re/string/[gp]  替换操作,g表全局,p为打印指示。

示例:

1. 删除 d命令

[zhongming@oser116 ~]$ cat 1.sql
1
2
3
[zhongming@oser116 ~]$ sed '2d' 1.sql
1
3
[zhongming@oser116 ~]$ cat 1.sql
1
2
3
[zhongming@oser116 ~]$ sed -i '2d' 1.sql
[zhongming@oser116 ~]$ cat 1.sql       
1
3

剔除文本第二行,将结果返回给终端,不改变文件内容。
使用-i参数时将结果修改至原文件。

2. 替换 s命令

[zhongming@oser116 ~]$ cat 1.sql       
1
3
[zhongming@oser116 ~]$ sed 's/1/&a/' 1.sql
1a
3

匹配到1时替换为自身+a,&表示替换字符串中被找到的部份。

3. 其它

[zhongming@oser116 ~]$ cat 1.sql
1
1
1
1
1
1
3
3
3
3
3
3
[zhongming@oser116 ~]$ sed -e 's/1/a/' -e '/3/d' 1.sql
a
a
a
a
a
a
[zhongming@oser116 ~]$ sed -n '2{=;p;q}' 1.sql
2
1

a. 多点编辑,匹配到1则替换为a,匹配到3则删除该行
b. 打印第二行的行号,然后打印第二行内容,继而退出

分享到:
评论

相关推荐

    linux系统,awk,grep,sed

    ### Linux系统中的查询三剑客:grep、awk、sed 使用详解 #### grep 命令详解 `grep` 是一个非常强大的文本搜索工具,它可以在文本中查找指定的字符串,并且能够逐行处理文本。这使得 `grep` 成为了文本处理和数据...

    Cygwin64 windows grep awk sed cat

    常用linux命令在windows环境下使用 windows grep awk sed cat

    sed awk grep

    sed awk grep sed awk grepsed awk grep sed awk grep sed awk grep sed awk grep sed awk grep sed awk grep sed awk grep

    grep awk sed 都有正则表达式个人收藏经典参考书,强烈推荐

    最头疼的是,这些重复部分的语法还各不相同,(比如 grep awk sed 都有正则表达式匹配的功能,但是三者的正则表达式语法就不相同) 最最最头疼的是,每个工具还分 GNU 版和不是 GNU 版,之间的差别也很大, 最最最最...

    grep awk sed调研文档

    ### Grep、Awk、Sed调研文档 #### 引言 `grep`(全局搜索正则表达式并打印出匹配的行)是一款强大的文本搜索工具,在Linux和Unix环境中广泛使用。它能够根据用户提供的正则表达式在指定的一个或多个文件中查找匹配...

    grep,sed, awk 总结

    grep适用于简单的搜索和计数任务,sed则更加强大,可以进行文本替换和复杂编辑,而awk则类似于一种简化的编程语言,其在文本处理上提供了极高的灵活性和强大的功能。熟练掌握这三个工具,将大幅提高Linux环境下的...

    grep,sed,awk命令实例大练习

    ### grep、sed、awk命令实例大练习 在Linux或Unix环境中,`grep`、`sed`和`awk`是三个非常强大的文本处理工具。通过掌握这些工具的基本用法及高级功能,用户可以高效地处理各种文本文件。下面将详细介绍如何使用...

    grep、sed、awk、perl等对正则表达式的支持的差别

    在IT领域,文本处理是日常工作中不可或缺的一部分,而grep、sed、awk和perl这四个工具在处理文本时都广泛地使用了正则表达式。它们各自有着不同的特性和适用场景,理解它们之间的差异有助于我们更高效地进行文本操作...

    win下的grep/sed/awk

    然而,为了实现类似的功能,例如文本处理和搜索,有一些工具可以帮助我们在Windows环境下模拟Unix/Linux中的`grep`、`sed`和`awk`。这三个工具在文本处理领域极其重要,它们分别用于查找、替换和格式化文本数据。 `...

    linux grep sed awk命令详解

    ### Linux grep sed awk命令详解 #### 一、grep命令详解 **grep** 是一个用于查找文件里符合条件的字符串的强大工具。它可以对文件进行快速搜索,找出含有特定模式的行。 - **基本语法**:`grep [选项] 模式 文件...

    第二模块:Linux核心命令grep awk sed.docx

    Linux核心命令是指在Linux操作系统中常用的、基本的命令,这些命令可以帮助用户管理文件、目录、进程、用户、网络等系统资源。以下是一些常见的Linux核心命令及其简要说明: 1. **ls**:列出目录中的文件和子目录。...

    sed_awk_grep.chm

    sed awk grep命令使用 sed awk grep命令使用 sed awk grep命令使用

    awk和sed思维导图

    在Unix/Linux操作系统中,awk和sed是两款强大的文本处理工具,它们被广泛用于数据提取、格式转换、文本操作等任务。这两个命令都是基于行的工具,处理文本时以行为单位进行操作。 **awk** awk是一种编程语言,它...

    shell编程,sed,awk,grep等教程整理

    本文将深入探讨shell编程,以及与之紧密相关的sed、awk和grep命令,这些都是Linux系统中进行文本处理和数据操作的重要工具。 首先,让我们了解什么是Shell编程。Shell是操作系统提供的一个接口,允许用户与系统内核...

    windows上可直接使用的awk、sed、grep等文本处理命令和彩色显示echo命令(from.Cygwin).zip

    包含命令:awk、cat、cut、diff、echo、gawk、grep、head、sed、sort、tac、tail、tr、uniq、wc 可以在windows上cmd窗口显示彩色文字,用法:echo.exe -e "\033[32;1mGREEN\033[0m

    sed和awk的必备书籍

    包括: 1. sed与awk+第三版(中文高清晰),内容非常全面详细,看了觉得很不错,学习sed和awk的必备书籍。 2. Effective awk Programming, 4th Edition 3. Sed与awk第二版(高清版).pdf

    awk、sed和grep

    在IT领域,文本处理是日常工作中不可或缺的一部分,而awk、sed和grep是Linux/Unix环境中强大的文本处理工具,它们各自有着独特的功能和应用场景。这里,我们将深入探讨这三个工具及其使用方法。 首先,让我们来了解...

    linux匹配命令awk、grep、sed简介

    ### Linux中的文本处理工具:awk、grep、sed #### 一、awk命令详解 **1.1 awk简介** - **定义**: awk 是一种强大的文本处理工具,也是一种编程语言,主要用于处理数据和生成报告。 - **功能**: awk 通过逐行扫描...

    awk and sed 3

    8. **与其他工具结合使用**:可能提到了`awk`和`sed`如何与其他Unix/Linux命令行工具如`grep`、`sort`、`cut`等协同工作,增强文本处理能力。 9. **最新版本特性**:如果这份文档是关于最新版本的,那么可能会介绍...

Global site tag (gtag.js) - Google Analytics