shell编程(五)

grep命令

Grep命令功能:按照行方式处理文本。。。
grep 一般格式为:
grep [选项]基本正则表达式[文件]
Grep参数
-c 只输出匹配行的计数。
-I 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
多文件查找

$ grep "sort"*.doc

或在所有文件中查询单词“ sort it”

$ grep "sort it" *
$ grep -c "48"data.f
$ 4

grep返回数字4,意义是有4行包含字符串“48”

显示满足匹配模式的所有行行数

[root@localhost /]# grep -n "48" data.f
1:48    Dec     3BC1997         LPSX    68.00   LVX2A   138
2:483     Sept    5AP1996         USP     65.00   LVX2C   189
5:484     nov     7PL1996         CAD     49.00   PLV2C   234
6:483     may     5PA1998         USP     37.00   KVM9D   644

显示不匹配的行

[root@localhost /]# grep -v "48" data.f
 47      Oct     3ZL1998         LPSX    43.00   KVM9D   512
 219     dec     2CC1999         CAD     23.00   PLV2C   68
 216     sept    3ZL1998         USP     86.00   KVM9E   234

大小写敏感

[root@localhost /]# grep -i "sept" data.f
483     Sept    5AP1996         USP     65.00   LVX2C   189
216     sept    3ZL1998         USP     86.00   KVM9E   234

正则表达式模式匹配

不匹配行首 如果要抽出记录,使其行首不是48,可以在方括号中使用^记号,表明查询在行首开始。

[root@localhost /]# grep '^[^48]' data.f
219     dec     2CC1999         CAD     23.00   PLV2C   68
216     sept    3ZL1998         USP     86.00   KVM9E   234

如果抽取以K开头,以D结尾的所有代码,可使用下述方法,因为已知代码长度为5个字符:

[root@localhost /]# grep 'K...D' data.f
47      Oct     3ZL1998         LPSX    43.00   KVM9D   512
483     may     5PA1998         USP     37.00   KVM9D   644

使用grep匹配“与”或者“或”模式

[root@localhost /]# grep -E '216|219' data.f
219     dec     2CC1999         CAD     23.00   PLV2C   68
216     sept    3ZL1998         USP     86.00   KVM9E   234

Grep命令原理
GREP 是 Global Regular Expression Print 的缩写
对于标准输入的每一行,grep执行以下的操作:
(1) 把下一输入行复制到模式空间中. 模式空间是只可保存一个文本行的缓冲区.
(2) 对模式空间应用正则表达式.
(3) 如果有匹配存在,该行从模式空间中被复制到标准输出.
grep实用程序对输入的每行重复这三个操作步骤.

扫描二维码关注公众号,回复: 933636 查看本文章

注意grep处理下列情况的方式:
1.grep是一个搜索程序,它只能搜索匹配一个正则表达式的一行的存在性.
2.grep可以对一行采取唯一的动作是把它发送到标准输出. 如果该行不匹配正则表达式,则其不被打印.
3.行的选择只基于正则表达式. 行编号或其他准则不能用于选择行.
4.grep是一个过滤器. 它可用在管道的左边或右边.
5.grep不能用于增加,删除或修改行.
6.grep不能用于只打印行的一部分.
7.grep不能只读取文件的一部分.
8.grep不能基于前面的内容或下一行来选择一行.只有一个缓冲区,它只保存当前行.

awk命令

1 awk语法及工作原理
awk可从文件或字符串值基于指定规则浏览和抽取信息
有三种方式调用a w k,
第一种是命令行方式,如:
这里,c o m m a n d s是真正的a w k命令。本章将经常使用这种方法。
上面例子中,[ - F域分隔符]是可选的,因为a w k使用空格作为缺省的域分隔符,因此如果
浏览域间有空格的文本,不必指定这个选项,但如果要浏览诸如 p a s s w d文件,此文件各域
冒号作为分隔符,则必须指明- F选项,如:
第二种方法是将所有a w k命令插入一个文件,并使 a w k程序可执行,然后用a w k命令解释
作为脚本的首行,以便通过键入脚本名称来调用它。
第三种方式是将所有的a w k命令插入一个单独文件,然后调用:
awk是一种编程语言,用于在linux/unix下对文本和数据进行扫描与处理。数据可以来自标准输入、文件、管道。
awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Peter Weinberger、Brian Kernighan。
实际上awk有很多种版本,如:awk、nawk、mawk、gawk、MKS awk、tawk… 这其中有开源产品也有商业产品。
目前在Linux中常用的awk编译器版本有mawk,gawk,其中以RedHat为代表使用的是gawk,以Ubuntu为代表使用的是mawk。
gawk是GNU Project 的awk解释器的开源代码实现。

2原理
1). awk逐行扫描文件,从第一行到最后一行,寻找匹配特定模式的行,并在这些行上进行你想要的操作。
2). awk基本结构包括模式匹配(用于找到要处理的行)和处理过程(即处理动作)。
pattern {action}
3). awk有两个特殊的模式:BEGIN和END,他们被放置在没有读取任何数据之前以及在所有数据读取完成以后执行。

这里写图片描述
2 awk的3种调用方式
3 awk模式动作、域和记录、字段分隔符

4awk应用举例

$ awk '{ print $0 }' /etc/passwd
$ awk -F":" '{ print $1 }' /etc/passwd
$ awk -F":" '{ print $1 " " $3 }' /etc/passwd
$ awk -F":" '{ print "username: " $1 "/t/tuid:" $3" }' /etc/passwd
 [wbm@localhost ~]# awk -F:  '$3>500  {print  $1}'      /etc/passwd     
 备注:列出计算机中ID号大于500的用户名

awk条件及循环语句
例子:从*.sh中查找case出现的文件及行号,分开打印。
Awk内置函数

这里写图片描述

sed命令

sed命令语法

1.sed是一款流编辑工具,用来对文本进行过滤与替换工作,特别是当你想要对几十个配置文件做统计修改时,你会感受到sed的魅力!
sed通过输入读取文件内容,但一次仅读取一行内容进行某些指令处理后输出,所以sed更适合于处理大数据文件。
.sed流程:
* 通过文件或管道读取文件内容。
* sed并不直接修改源文件,而是将读入的内容复制到缓冲区中,我们称之为模式空间(pattern space)。
* 根据sed的指令对模式空间中的内容进行处理并输出结果,默认输出至标准输出即屏幕上。
输入
————————————————
|
|
v
v
读取一行内容,并复制到模式空间 <———— sed 指令
|
|
v
v
————————————————
输出经过处理后的内容

二、sed基本语法结构

sed Options… [script] [inputfile…]
sed 选项… [脚本指令] [输入文件]
如果没有输入文件,则sed默认对标准输入进行处理(即键盘输入)。脚本指令是第一个不以“-”开始的参数。
1.选项含义:
–version 显示sed版本。
–help 显示帮助文档。
-n,–quiet,–silent 静默输出,默认情况下,sed程序在所有的脚本指令执行完毕后,将自动打印模式空间中的内容,这些选项可以屏蔽自动打印。
-e script 允许多个脚本指令被执行。
-f script-file,
–file=script-file 从文件中读取脚本指令,对编写自动脚本程序来说很棒!
-i,–in-place 直接修改源文件,经过脚本指令处理后的内容将被输出至源文件(源文件被修改)慎用!
-l N, –line-length=N 该选项指定l指令可以输出的行长度,l指令用于输出非打印字符。
–posix 禁用GNU sed扩展功能。
-r, –regexp-extended 在脚本指令中使用扩展正则表达式
-s, –separate 默认情况下,sed将把命令行指定的多个文件名作为一个长的连续的输入流。GNU sed则允许把他们当作单独的文件, 这样如正则表达式则不进行跨文件匹配。
-u, –unbuffered 最低限度的缓存输入与输出。

sed应用举例

[wbm@wmblinux64 05sed]$ sed -n 'p' test.txt 
aaaa=111
bbbb=222

cccc=3333


dddd=44444
[wbm@wmblinux64 05sed]$
包括空行

[wbm@wmblinux64 05sed]$ sed -n '3,/ddd/p' testfile.txt  从第三行开始匹配,打印到含有ddd的行

[wbm@wmblinux64 05sed]$ sed -n '/^$/=' testfile.txt  打印空行
3
5
6
[wbm@wmblinux64 05sed]$ sed -n -e '/^$/p' -e '/^$/=' testfile.txt 即打印空行又打印行号

3

5

6

以上仅是sed程序本身的选项功能说明
这里就简单介绍几个脚本指令操作作为sed程序的例子。

    a,append        追加
    i,insert        插入
    d,delete        删除
    s,substitution  替换

查找替换应用举例

sed  '2a TYPE=Ethernet'  test.txt    第二行后添加TYPE=Ethernet
sed  '3i  TYPE=Ethernet'  test.txt   第三行前添加TYPE=Ethernet
sed  's/yes/no/g'     test.txt       将样本文件中的所有yes替换为no
sed  '3,4d'  test.txt                删除第34行的内容

总结:以上大多数操作指令,都依据行号定位操作对象(地址),如:2a即第二行后添加。
但实际情况可能大多数情况你并不确定你要操作对象(地址)的行号,这时更多的我们会使用正则表达式确定操作对象(地址)。
下面是使用正则表达式定位操作行的示例:
sed ‘/222/a iiii=1111 ’ testfile.txt
匹配到包含222的行,并在其后添加iiii=1111
sed ‘/^aaa/d’ testfile.txt
匹配以aaaa开始的行,并删除改行

需要执行多个指令时,可以使用以下三种方法:

#sed  's/yes/no/;s/static/dhcp/'  test.txt            注:使用分号隔开指令。

 #sed  -e  's/yes/no/'    -e  's/static/dhcp/'  test.txt    注:使用-e选项。

#sed '
    >s/yes/no/
    >s/static/dhcp/'  test.txt                                    注:利用分行指令。

然而在命令行上输入过长的指令是愚蠢的,这时就需要-f选项指定sed脚本文件,在脚本文件中可以包含多行指令,而且便于修改!

sed  -i  's/^M//g'  a.txt > new.out 
cat gpdata_wbm10.bak | sed 's/^M//g' | awk '$0' > 2.log
sed命令DOS2UnixFile

使用技巧
vim中,打开vim编译器执行set nu命令。

经验话语:
shell脚本参数意义
在shell中,表示值是用$,相当于DOS中的%
1.位置参数
一般是系统或用户提供的参数。
$[0-n],$0,表示指令本身,$1表示第一个参数,一次类推
$0是内部参数,必须要有的,其后的就可有可无了
2.内部参数

$# ----参数数目
$? ----上一个代码或者shell程序在shell中退出的情况,如果正常退出则返回0,反之为非0值。
$* ----所有参数的字符串

猜你喜欢

转载自blog.csdn.net/coolwriter/article/details/80236018