一、grep用法
**************************************
++++++用一些特殊的函数来处理参数++++++
*$# 传递给函数的参数个数
*$* 显示所有传递给函数的参数
*$@ 与$*相同但略有不同
*$? 函数的返回值
**************************************
1、grep一般格式
grep [选项] 基本正则表达式 [文件]
2、双引号引用
在grep命令中输入字符串参数时,最好将其用双引号括起来。例如:“mystring”
3、grep选项
常用的grep选项有:
*************************************************
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
*************************************************
4、查询多个文件
在当前目录下所有.doc文件中查找字符串“sort”
grep “sort”* .doc
5、行匹配
grep -c “48” txt
显示满足匹配模式的所有行行数:
grep -n "48" txt
6、精确匹配
grep “48<tab>” txt
grep “48>” txt
7、不匹配行首
如果要抽出记录,使其行首不是48,可以在方括号中使用^记号,表明查询在行首开始
grep ‘^[^48]’ txt
9、使用grep匹配“与”或者“或”模式
grep命令加- E参数,这一扩展允许使用扩展模式匹配
例如,要抽取城市代码为 219或216,方法如下:
grep -E “219|216” txt
10、空行
grep '^$' txt
grep -v '^$' 非空行
11、目录
如果要查询目录列表中的目录,方法如下:
ls -l | grep '^d'
如果在一个目录中查询不包含目录的所有文件,方法如下:
ls -l | grep '^[^d]'
要查询其他用户和其他用户组成员有可执行权限的目录集合,方法如下:
ls -l | grep '^d......x..x'
在 grep命令中使用- v选项可丢弃ps命令中的grep进程。
ps ax | grep named | grep -v "grep"
二、awk用法
1、调用awk
有三种方式调用a w k,第一种是命令行方式,如:
awk [-F filed-separator] 'commands' inputs-file(s)
这里,commands是真正的awk命令。本章将经常使用这种方法。
上面例子中, [ - F域分隔符]是可选的,因为 a w k使用空格作为缺省的域分隔符,因此如果
要浏览域间有空格的文本,不必指定这个选项,但如果要浏览诸如 passwd文件,此文件各域
以冒号作为分隔符,则必须指明 - F选项,如:
awk -F:'command' input-file
第二种方法是将所有 a w k命令插入一个文件,并使 a w k程序可执行,然后用 a w k命令解释
器作为脚本的首行,以便通过键入脚本名称来调用它。
第三种方式是将所有的 awk命令插入一个单独文件,然后调用:
awk -f awk-script input-files
- f选项指明在文件 awk_script_file中的awk脚本,input_file(s)是使用awk进行浏览的文件名。
2、awk脚本
在命令中调用awk时,awk脚本由各种操作和模式组成。
如果设置了 - F选项,则awk每次读一条记录或一行,并使用指定的分隔符分隔指定域,但
如果未设置- F选项,awk假定空格为域分隔符,并保持这个设置直到发现一新行。当新行出现
时,awk命令获悉已读完整条记录,然后在下一个记录启动读命令,这个读进程将持续到文件
尾或文件不再存在。
3、模式和动作
任何a w k语句都由模式和动作组成。在一个 awk脚本中可能有许多语句。模式部分决定动
作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保
持执行状态。
模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段 BEGIN和
END。使用BEGIN语句设置计数和打印头。 BEGIN语句使用在任何文本浏览动作之前,之后
文本浏览动作依据输入文件开始执行。 END语句用来在 awk完成文本浏览动作后打印输出文
本总数和结尾状态标志。如果不特别指明模式, awk总是匹配或打印行数。
实际动作在大括号{ }内指明。动作大多数用来打印,但是还有些更长的代码诸如 if和循环
(looping)语句及循环退出结构。如果不指明采取动作, awk将打印出所有浏览出来的记录
4、域和记录
awk执行时,其浏览域标记为 $1,$2...$n。这种方法称为域标识。使用这些域标识将更容
易对域进行进一步处理。
使用$1,$3表示参照第1和第3域,注意这里用逗号做域分隔。如果希望打印一个有 5个域
的记录的所有域,不必指明 $1,$2,$3,$4,$5,可使用 $0,意即所有域。 Awk浏览时,到达一新
行,即假定到达包含域的记录末尾,然后执行新记录下一行的读动作,并重新设置域分隔。
注意执行时不要混淆符号 $和shell提示符$,它们是不同的。
为打印一个域或所有域,使用 print命令。这是一个awk动作(动作语法用圆括号括起来)
awk ‘{print $0}’ txt > wow (重定向)
awk ‘{print $0}’ txt tee hello.txt (输出到屏幕并且重定向到文件)
awk ‘{print $1, $4}’ txt(不要忘了加逗号以分割域)
5、打印报告头部
上述命令输出在名字和腰带级别之间用一些空格使之更容易划分,也可以在域间使用 tab
键加以划分。为加入 tab键,使用tab键速记引用符 ,后面将对速记引用加以详细讨论。也可
以为输出文本加入信息头。本例中加入 name和belt及下划线。下划线使用 ,强迫启动新行,
并在 下一行启动打印文本操作。打印信息头放置在 BEGIN模式部分,因为打印信息头被界
定为一个动作,必须用大括号括起来。在 awk查看第一条记录前,信息头被打印。
awk 'BEGIN {print "name Belt --------------------------------"}
{print $1" "$4}' txt
6、打印信息尾
awk ‘BEGIN {print “Name -------”} {print $1} END {“end-of-report”}’
7、匹配
为使一域号匹配正则表达式,使用符号‘~’后紧跟正则表达式,也可以用 if语句。a w k
中if后面的条件用()括起来。
awk ‘{if($4~/Brown/)print $0}’ txt
awk ‘$0~ /Brown/’ txt
两条命令效果相同
8、精确匹配
为精确匹配,使用等号 ==,并用单引号括起条件
awk ‘$3=="48" {print $0}’ txt
不匹配
awk '$3 != "48" {print $0}' txt
awk ‘$0!~ /Brown/’ txt
9、或关系匹配
为抽取级别为yellow或brown的记录,使用竖线符 |。意为匹配 | 两边模式之一。注意,使
用竖线符时,语句必须用圆括号括起来
awk ‘$0~/(yellow|brown)/’ txt
复合模式或复合操作符用于形成复杂的逻辑操作,复杂程度取决于编程者本人。有必要
了解的是,复合表达式即为模式间通过使用下述各表达式互相结合起来的表达式:
&& AND : 语句两边必须同时匹配为真。
|| O R:语句两边同时或其中一边匹配为真。
! 非 求逆
10. AND
打印记录,使其名字为‘ P.Bunny且级别为 Yellow,使用表达式 ($1 == " P.Bunny " && $4 == " Yellow "),意为& &两边匹配均为真。完整命令如下
awk ‘{if ($1=="p.bunny" && $4=="Yellow")print $0}’ txt
三、sed用法
*************************************************
p 打印匹配行
= 显示文件行号
a 在定位行号后附加新文本信息
i 在定位行号后插入新文本信息
d 删除定位行
c 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即推出
l 显示与八进制ASCII代码等价的控制字符
{ } 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行;允许跨行的模式匹配语句
***************************************************
1、打印范围
sed -n '2p' txt 显示第二行
sed -n ‘1,3p’ txt 显示打印1到三行
2、打印模式
假定要匹配单词Neave,并打印此行,方法如下。使用模式/pattern/格式,这里为/Neave/。
sed -n ‘/Neave/'p txt
sed -n ‘/the/'p txt
3、使用模式和行号进行查询
sed -n '4,/The/'p txt 查找第四行the
sed -n ‘6,/hello/’p txt
4、匹配元字符
匹配元字符必须使用反斜线疲敝其特殊协议 格式为/$/p
sed -n '/$/'p txt
5、显示整个文件
sed -n ‘1,$p’ txt
6、任意字符
匹配任意字母,后跟任意字母的 0次或多次重复,并以ing结尾,模式为/.*ing/
sed -n '/.*ing'p txt
7、打印行号
要打印行号,使用等号 =。打印模式匹配的行号,使用格式 /pattern/=。
如果只打印行号及匹配行,必须使用两个 sed命令,并使用 e选项。第一个命令打印模式
匹配行,第二个使用=选项打印行号,格式为 sed -n -e /pattern/p -e /pattern/=
sed -n -e ‘/music/p’-e ‘/music/=’txt
8、删除文本
sed删除文本格式:
[address [,address]]d
地址可以是行的范围或模式,让我们看几个例子。
删除第一行;1d意为删除第一行
sed ‘1d’ txt
删除第一到第三行:
sed ‘1,3d’ txt
删除最后一行
sed ‘$d’ txt
也可以使用正则表达式进行删除操作。下面的例子删除包含文本‘Neave’的行。
sed ‘/Neave/d’ txt
9、替换文本
替换命令用替换模式替换指定模式,格式为:
[ address [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
*******************************************************************************
s 选项通知 sed这是一个替换操作,并查询 pattern-to-find,成功后用replacement-pattern替换它。替换选项如下:
g 缺省情况下只替换第一次出现模式,使用 g选项替换全局所有出现模式。
p 缺省sed将所有被替换行写入标准输出,加 p选项将使 - n选项无效。 - n选项不打印输出结果。
w 文件名 使用此选项将输出定向到一个文件。
*******************************************************************************
sed ‘s/night/NIGHT’txt night替换为NIGHT
要从$90中删除$符号,在replacement-pattern部分不写任何东西,保留空白
sed ‘s/$//’txt
要进行全局替换,即替换所有出现模式,只需在命令后加 g选项
将所有The替换成Wow!
sed ‘s/The/Wow!/g’ txt
10、使用替换修改字符串
如果要附加或修改一个字符串,可以使用( &)命令,&命令保存发现模式以便重新调用
它,然后把它放在替换字符串里面。这里给出一个修改的设计思路。先给出一个被替换模式,
然后是一个准备附加在第一个模式后的另一个模式,并且后面带有 &,这样修改模式将放在
匹配模式之前。例如, sed语句s/nurse/"Hello"&/p 的结果如下:
sed -n ‘s/nurse/"hello" &/p’ txt
sed -n ‘s/played/hello wolrd &p’ txt
用一个空格替换所有的( # #)符号。
sed 's/##*//g' txt
删除所有行首的0,使用^符号表示模式从行首开始,^0*表示行首任意个0,
模式s/^0*//g设置替换部分为空,即为删除模式,正是要求所在
sed 's/^0*//g' txt
11、快速一行命令
******************************************************************
下面是一些一行命令集。([ ]表示空格,[ ]表示t a b键)
‘s/.$//g’ 删除以句点结尾行
‘-e/abcd/d’ 删除包含a b c d的行
‘s/[ ][ ][ ]*/[ ]/g’ 删除一个以上空格,用一个空格代替
‘s/^[ ][ ]*//g’ 删除行首空格
‘s/.[ ][ ]*/[ ]/g’ 删除句点后跟两个或更多空格,代之以一个空格
‘/^$/d’ 删除空行
‘s/^.//g’ 删除第一个字符
‘s/COL(...)//g’ 删除紧跟C O L的后三个字母
‘s/^///g’ 从路径中删除第一个
‘s/[ ]/[ ]//g’ 删除所有空格并用t a b键替代
‘S/^[ ]//g’ 删除行首所有 t a b键
‘s/[ ]*//g’ 删除所有t a b键
********************************************************************
为了使用上述输出信息做进一步自动处理,需要知道所存数据库名称,为此需执行以下
操作:
1) 使用s / - * / / g删除横线- - - - - -。
2) 使用/ ^ $ / d删除空行。
3) 使用$ d删除最后一行
4) 使用1 d删除第一行。
5) 使用awk {print $1}打印第一列。
命令如下,这里使用了cat,并管道传送结果到sed命令
cat txt|sed 's/--*//g'| sed '/^$/d' | sed '$d' | sed '1d' | awk '{print $1}'