2008年1月23日星期三

Oracle学习笔记20080122

sed。。没用过。。
先这么学者吧sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。
sed可以做些什么呢?别忘了,Vi(Ubuntu下为vim)也是一个文本编辑器。sed可以随意编辑小或大的文件,有许多sed命令用来编辑、删除,并允许做这项工作时不在现场。sed一次性处理所有改变,因而变得很有效,对用户来讲,最重要的是节省了时间
调用sed有三种方式:
在命令行键入命令;
将sed命令插入脚本文件,然后调用sed;
将sed命令插入脚本文件,并使sed脚本可执行。

使用sed命令行格式为:sed [选项] sed命令 输入文件。
记住在命令行使用sed命令时,实际命令要加单引号。
sed也允许加双引号。使用sed脚本文件,格式为:
sed [选项] -f sed脚本文件
输入文件要使用第一行具有sed命令解释器的sed脚本文件,其格式为:
sed脚本文件 [选项] 输入文件不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件,sed从标准输入中接受输入,一般是键盘或重定向结果。
sed选项如下:
n 不打印;sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。
p 命令可以用来打印编辑行。
c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条sed命令,此选项无用,但指定它也没有关系。
f 如果正在调用sed脚本文件,使用此选项。此选项通知sed一个脚本文件支持所有的sed命令,例如:sed -f myscript.sed input_file,这里myscript.sed即为支持sed命令的文件。

使用sed在文件中查询文本的方式sed浏览输入文件时,缺省从第一行开始,有两种方式定位文本:
1) 使用行号,可以是一个简单数字,或是一个行号范围。
2) 使用正则表达式,怎样构建这些模式请参见第 7章。

x x为一行号,如1x,y 表示行号范围从x到y,如2,5表示从第2行到第5行/pattern/ 查询包含模式的行。例如/disk/或/[a-z]/ /pattern/pattern/ 查询包含两个模式的行。
例如/disk/disks/pattern/,x 在给定行号上查询包含模式的行。
如/ribbon/,3x,/pattern/ 通过行号和模式查询匹配行。3./vdu/x,y! 查询不包含指定行号x和y的行。1,2!

sed编辑命令
p 打印匹配行
= 显示文件行号
a\ 在定位行号后附加新文本信息
i\ 在定位行号后插入新文本信息
d 删除定位行
c\ 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即推出
l 显示与八进制A S C I I代码等价的控制字符
{ } 在定位行执行的命令组n 从另一个文件中读文本下一行,并附加在下一行g 将模式2粘贴到/pattern n/y 传送字符n 延续到下一输入行;允许跨行的模式匹配语句

print命令格式为[address [,address] P。显示文本行必须提供sed命令行号。
address表示行数,单个'2'p,多行则是'1,3p' 只打第二行则是sed -n '2'p ...打单个单词则需要
sed -n '/.../'p filename还可以使用sed -n '4,/.../'p filename 在4行查询一个字字符则需要
sed -n '/\$/'p filename这个字符要打印整个文件,只需将行范围设为第一行到最后一行1,$。
$意为最后一行。sed -n '1,$p' filename匹配任意字母,后跟任意字母的 0次或多次重复,并以ing结尾,模式为/.*ing /。可以使用这个模式查询以ing结尾的任意单词。
sed -n '/.*ing' filename要打印文件第一行,使用行号:sed -n '1p' filename和sed -n '1'p filename效果是一样的
要打印最后一行,使用$。$是代表最后一行的元字符。sed -n '$p' filename和sed -n '$'p filename貌似效果也是一样的
要打印行号,使用等号=。打印模式匹配的行号,使用格式/pattern/ =。如果只打印行号及匹配行,必须使用两个sed命令,并使用e选项。
第一个命令打印模式匹配行,第二个使用=选项打印行号,格式为sed -n -e /pattern/p -e /pattern/=。
要附加文本,使用符号a\,可以将指定文本一行或多行附加到指定行。(这个没有例子发觉比较难)
要创建脚本文件append.sed,输入下列命令:
$pg append.sed#!/bin/sed -f/compand/ a\Then suddenly it happend
推出保存,增加可执行
$chomd u+x append.sed
运行
$append.sed quote.txt
你会发觉第二行有上面then这句话现在查看其具体功能。
第一行是sed命令解释行。脚本在这一行查找sed以运行命令,这里定位在/bin。
第二行以/company /开始,这是附加操作起始位置。a\通知sed这是一个附加操作,首先应插入一个新行。第三行是附加操作要加入到拷贝的实际文本。输出显示附加结果。如果要保存输出,重定向到一个文件。
将sed结果写入其他文件
[address [,address]]w filename$sed '1,2 w filedt' quote.txt

处理文件时,sed允许从另一个文件中读文本,并将其文本附加在当前文件。此命令放在模式匹配行后,格式为:address r filename
有时需要在模式匹配首次出现后退出sed,以便执行其他处理脚本。
退出命令格式为:address q

sed格式为:[address,[address ] ] l‘l’意为列表。一般情况下要列出整个文件,而不是模式匹配行,因此使用 l要从第一到最后一行。模式范围1,$即为此意。
cat -v filename可查看文件有没控制字符,有的话是乱码然后可用sed查看

实例:
假设在一个文档中filename有许多的
12313##DISP##45.13^M
00323##DISP##23.11^M
01299##DISP##34.16^M
可采取以下动作:
1) 用一个空格替换所有的(##)符号。
2) 删除起始域中最前面的0(00)。
3) 删除行尾控制字符(^M)。
任务1。 删除所有的#字符很容易,可以使用全局替换命令。这里用一个空格替换两个或更多的#符号。$sed 's/##*//g' filename
任务2。删除所有行首的0。使用^符号表示模式从行首开始,^0*表示行首任意个0。模式s/^0*//g设置替换部分为空,即为删除模式,正是要求所在。$sed 's/^0*//g' filename
任务3。 最后去除行尾 ^ M符号,为此需做全局替换。设置替换部分为空。模式为:‘s/^m/ /g’,注意‘^M’,这是一个控制字符。要产生控制字符(^M),需遵从前面产生F 键同样的处理过程。步骤如下;键入 sed s/,然后按住键和v键,释放v键,再按住^键,并保持键不动,再释放两个键,最后按键。下面命令去除行尾^M字符。$sed 's/^M//g'filename

以上可以合并
$cat filename sed 's/^0*//g' sed 's/##*//g' sed 's/^M//g'
当从数据库中执行语句输出时,一旦有了输出结果,脚本即可做进一步处理。通常先做一些整理,下面是一个sql查询结果。
database size date created
-----------------------------
gosouth 2244 12/11/97
trisud 5632 8/9/99

为了使用上述输出信息做进一步自动处理,需要知道所存数据库名称,为此需执行以下操作:
1) 使用s/-*/ /g删除横线------。
2) 使用/^$/d删除空行。
3) 使用$d删除最后一行
4) 使用1d删除第一行。
5) 使用awk {print $1}打印第一列。
命令如下$cat filename sed 's/--*//g' sed '/^$/d' sed '$d' sed '1d' awk '{print $1}'
距离去除行首数字$sed 's/^[0-9]//g' filename数字后添加passwd$sde 's/[0-9][0-9]*/& Passwd/g' filename

要从命令行中向sed传值,值得注意的是用双引号,否则功能不执行。
快速命令集
's/\.$//g'删除以句点结尾行
'-e/abcd/d'删除包含abcd的行
's/[][][]*/[]/g'删除一个以上空格,用一个空格代替
's/^[][]*//g'删除行首空格
's/\.[][]*/[]/g'删除句点后跟两个或更多空格,代之以一个空格
'/^$/d'删除空行
's/^.//g'删除第一个字符
's/COL\(...\)//g'删除紧跟COL的后三个字母
's/^\///g'从路径中删除第一个\
's/[]/[]//g'删除所有空格并用tab键替代
'S/^[]//g'删除行首所有tab键
's/[]*//g'删除所有tab键

下一张文件的分割和合并

首先提上来的是sort,在ubuntu下sort了一下,发觉还真有sort命令的一般格式为:
sort -cmu -o output_file [other options] +pos1 +pos2 input_files

下面简要介绍一下sort的参数:
-c 测试文件是否已经分类。
-m 合并两个分类文件。
-u 删除所有复制行。
-o 存储sort结果的输出文件名。

其他选项有:
-b 使用域进行分类时,忽略第一个空格。
-n 指定分类是域上的数字分类。
-t 域分隔符;用非空格或t a b键分隔域。
-r 对分类次序或比较求逆。
+n n为域号。使用此域号开始分类。
n n为域号。在分类比较时忽略此域,一般与+n一起使用。
post1 传递到m,n。m为域号,n为开始分类字符数;

例如4,6意即以第5域分类,从第7个字符开始。

缺省情况下,sort认为一个空格或一系列空格为分隔符。要加入其他方式分隔,使用-t选项。
sort执行时,先查看是否为域分隔设置了- t选项,如果设置了,则使用它来将记录分隔成域0、域1等等;如果未设置,用空格代替。缺省时sort将整个行排序,指定域号的情况例外。
使用sort -c 查看sort文件是否按某种顺序分类基本的用
sort -t: filename
分类求逆sort -t: -r filename
按指定域分类sort -t: +1 filename 0
定义域从0开始算数值域分类sort -t:+3n filename
数值键的键位值唯一性分类sort -u filename去除重复的使用k
做分类键排序sort -t: -r -k4 -k1 filenamesort +0 -2 +3该命令以域0分类,忽略2,在用3分类可使用值得特定位数sort -t:+1.2 filename

排序后可使用head和tail进行罗列
合并sort -m sorted_file1 sorted_file2使用-m+o。将这个文件并入已存在的分类文件video.sort,要以名称域进行分类,实际上没有必要加入+o,但为了保险起见,还是加上的好。sort -t: -m +0 filename1 filename

系统sort$cat passwd sort -t: +0 awk -F":" '{print $1}'

uniq的用法
uniq用来从一个文本文件中去除或禁止重复行。一般uniq假定文件已分类,并且结果正确。
命令一般格式:uniq -u d c -f input-file output-file
其选项含义:
-u 只显示不重复行。
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数。
-f n为数字,前n个域被忽略。一些系统不识别-f选项,这时替代使用-n。

join的用法
join用来将来自两个分类文本文件的行连在一起。
join[options] input-file1 input-file2an n为一数字,用于连接时从文件 n中显示不匹配行。
例如,-a1显示第一个文件的不匹配行,-a2为从第二个文件中显示不匹配行。
o n.m n为文件号,m为域号。
1.3表示只显示文件1第三域,每个n,m必须用逗号分隔,如1.3,2.1。j n m n为文件号,m为域号。使用其他域做连接域。t 域分隔符。用来设置非空格或tab键的域分隔符。例如,指定冒号做域分隔符 - t:。

使用1.1显示第一个文件第一个域,2.2显示第二个文件第二个域,其间用逗号分隔。
$join -o 1.1,2.2 filename,filename2

使用-jn m进行其他域连接,例如用文件1域3和文件域2做连接键,命令为:
join -j1 3 -j2 2 file1 file2

cut用法cut
用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。
cut一般格式为:
cut[options]file1file2下面介绍其可用
选项:
-c list指定剪切字符数。
-f field指定剪切域数。
-d 指定与空格和tab键不同的域分隔符。
-c 用来指定剪切范围,如下所示:-c1,5-7剪切第1个字符,然后是第5到第7个字符。-c1-50剪切前50个字符。-f格式与-c相同。-f1,5剪切第1域,第5域。-f1,10-12剪切第1域,第10域到第12域。
使用域分隔符文件中使用冒号“:”为域分隔符,故可用- d选项指定冒号,如- d:。如果有意观察第3域,可以使用-f3。要抽取I D域。可使用命令如下:$cut -d: -f3 pers

paste格式为;
paste -d -s -file1 file2-d
类似于t选项后面制定分割标签,-s为横向粘帖选项含义如下:-d 指定不同于空格或t a b键的域分隔符。例如用@分隔域,使用- d @。-s 将每个文件合并成行而不是按行粘贴。- 使用标准输入。例如ls -l paste ,意即只在一列上显示输出。
paste命令还有一个很有用的选项(-)。意即对每一个(-),从标准输入中读一次数据。使用空格作域分隔符,以一个4列格式显示目录列表。方法如下:ls paste -d" " - - - -按一行四列ls paste -d" " -按一行一列

split用来将大文件分割成小文件。有时文件越来越大,传送这些文件时,首先将其分割可能更容易。使用vi或其他工具诸如sort时,如果文件对于工作缓冲区太大,也会存在一些问题。因此有时没有选择余地,必须将文件分割成小的碎片。
split命令一般格式:split -output_file-size input-filename output-filename

grep一般格式为:
grep [选项]基本正则表达式[文件]这里基本正则表达式可为字符串。

在grep命令中输入字符串参数时,最好将其用双引号括起来。在调用变量时,也应该使用双引号,在调用模式匹配时,应使用单引号
常用的grep选项有:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信
-v 显示不包含匹配文本的所有行。

如果要在当前目录下所有.doc文件中查找字符串“sort”,方法如下:
$ grep "sort"*.doc或在所有文件中查询单词“sort it”$ grep "sort it" *

自己的例子
$grep -c "acl" squid.conf$137返回值
$grep "acl" squid.conf$grep -n "acl" squid.conf显示带的行数
$grep -v "acl" squid.conf显示非查询行数

在精确匹配下可以加入表示点击tab键使用grep抽取精确匹配的一种更有效方式是在抽取字符串后加 \>。
缺省情况下,grep是大小写敏感的,如要查询大小写不敏感字符串,必须使用 - i开关。
模式查找可以套用[],其非可以使用^记号,根据[]有很多种变化可以使用不一一详解
出现几率抽取包含数字4至少重复出现两次的所有行,方法如下$grep '4\{2,\}' filename

grep命令加-E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为 219或216,方法如下:$grep -E '219216' filename
空行结合使用^和$可查询空行。使用-n参数显示实际行数:
$ grep '^$' squid.conf
$ grep -c '^$' squid.conf

特殊字符需要'\特殊字符'类名
类 等价的正则表达式 类 等价的正则表达式
[[:upper:]] [A-Z] [[:alnum:]] [0-9a-zA-Z]
[[:lower:]] [a-z] [[:space:]] 空格或tab键
[[:digit:]] [0-9] [[:alpha:]] [a-zA-Z]

如果要查询目录列表中的目录,方法如下
:$ls -l grep '^d'如果在一个目录中查询不包含目录的所有文件,方法如下:
$ls -l grep '^[^d]'要查询其他用户和其他用户组成员有可执行权限的目录集合,方法如下:
$ls -l grep '^d.....x..x'

后面继续awk...发觉D盘有这么个文章,但是似乎从来没看过。。
不知道是不是我放的有三种方式调用awk,
第一种是命令行方式,如:awk [-F field-separator] 'commands' input-file(s)上面例子中,[ - F域分隔符]是可选的,因为a w k使用空格作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项,但如果要浏览诸如 passwd文件,此文件各域以冒号作为分隔符,则必须指明-F选项(类似于前面所讲的-d:和-t:)
第二种方法是将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。
第三种方式是将所有的awk命令插入一个单独文件,然后调用:awk -f awk-script-file input-file(s)

没有评论: