跳至主要内容

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)

评论

此博客中的热门博文

Python学习笔记20100117

映射list   Dictionary 是用{}. list 是一那个[]. turple是用() 当你定义过dictionary后,你可以使用d.keys(), d.values(),d.items()将定义后的时候分别显示出来 当然可以将list里的值加减乘除,也可以如一般的定义直接重新复制这个list. 链接与分割字符串的 li=";", join(li) 则显示的就是 分隔符为;的数 如果使用li=li.split(";")则将刚刚;的分隔符删除,而split里也可定义域,如li.split(";",1)   自省 <---这是啥 之前在使用的时候发觉有些书本上的模块不能调用,很多是py脚本定义过的函数。 下载该脚本s,然后上传至指定位置。 >>>import sys >>>sys.path >>>sys.path.append("绝对位置")然后就能调用这些脚本和参数了。 删除 >>>sys.path.pop() 定义一个参数是 def info(test, test1=10.test2=12): info是函数名,test是必备参数,因为没有定义值,test1和test2是可选参数,定义了初始值   以上是外部函数的调用,下面转到内部函数 内部函数有type,str,dir及其他   ---type 返回任意字符的类型,模块也可以。types模块 >>> type(1) <type 'int'> >>> li=[] >>> type(li) <type 'list'> >>> import odbchelper >>> type(odbchelper) <type 'module'> >>> type(sys) <type 'module'> >>> import types ...

Python学习笔记20100128

methodList = [method for method in dir(object) if callable(getattr(object, method))] ###插一句, ifconfig pcn0 unplumb 去禁solaris的网卡plumb起网卡   and, or  已经and-or一起用。 and 两者为真,print第二个数,一个为假一个为真返回假,三者为真返回最后一个真。 or 两个为真,返回第一个, 一个为假一个为真返回真,三者为假返回最后一个假   lambda可快速定义最小值函数   g = lambda x:x*2 g(3) 6 (lambda x:x*2)(3)   doc string print getattr(object,mothod).__doc__   ljust ljust 用空格填充字符串以符合指定的长度。info 函数使用它生成了两列输出并将所有在第二列的 doc string 纵向对齐。 如果小于的话不会从中截断   -----面向对象 首先导入,你可以选择import module or from module import module 如果你要经常访问模块的属性和方法,且不想一遍又一遍地敲入模块名,使用 from module import。 如果你想要有选择地导入某些属性和方法,而不想要其它的,使用 from module import。 如果模块包含的属性和方法与你的某个模块同名,你必须使用 import module 来避免名字冲突   -----类的定义 class Lofs    pass   这个类的名字是 Loaf,它没有从其它类继承。 类名通常是第一个字母大写,如:EachWordLikeThis,但这只是一个习惯,不是一个必要条件。   这个类没有定义任何方法或属性,但是从语法上,需要在定义中有些东西,所以你使用 pass。这是一个 Python 保留字,仅仅表示 “向前走,不要往这看”。它是一条什么都不做的语句,当你删空函数或类时,它是一个很好的占位符。   你可能猜...

Back to Blog again

     My last blog was almost 6 years again.  lots of things happening those years. like marriage, and move to another country, simply relocation, something is very big in my life.      Back to now,  I guess it is a very good time to start with the blog again. no matter daily life or the tech parts.      These blog may or will contains various languages, Chinese, English or Few Japanese. The first thing, I change the profile to Kamata life, Kamata is Japanese words. "鎌田"  as Kanji. why this change happened, due to we will move from Tamagawa "玉川" to Kamata very soon. I hope I can start to write this not daily, but I hope I can do this continuously.