免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1885 | 回复: 0
打印 上一主题 下一主题

[学习求职] SHELL笔记 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-24 09:38 |只看该作者 |倒序浏览
#grep命令
在grep命令中输入字符串参数时,最好将其用双引号括起来。例如:“mystring”。这样做有两个原因,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串。在调用变量时,也应该使用双引号,诸如: grep“$MYVAR”文件名,如果不这样,将没有返回结果。在调用模式匹配时,应使用单引号。
常用的grep选项有:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
vi data.f(每列后是tab)
48 Dec 3BC1997 LPSX 68.00 LVX2A 138
483 Sept 5Ap1996 USP 65.00 LVX2C 189
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
483 may 5PA1998 USP 37.00 KVM9D 644
216 sept 3ZL1998 USP 86.00 KVM9E 234
结合使用^和$可查询空行。使用-n参数显示实际行数:
grep -n '^$' data.f
grep允许使用国际字符模式匹配或匹配模式的类名形式:
类 等价的正则表达式
[[:upper:]] [A-Z]
[[:alnum:]] [0-9a-zA-Z]
[[:lower:]] [a-z]
[[:space:]] 空格或tab键
[[:digit:]] [0-9]
[[:alpha:]] [a-zA-Z]
如:grep '5[[:upper:]][[:upper:]]' data.f
如果要查询目录列表中的目录,方法如下:
ls -l | grep '^d'
如果在一个目录中查询不包含目录的所有文件,方法如下:
ls -l | grep '^[^d]'
要查询其他用户和其他用户组成员有可执行权限的目录集合,方法如下:
ls -l | grep '^d.....x..x'
使用grep命令- s开关,可屏蔽错误信息。
wangnc> grep "test" fdasf.f
grep: can't open fdasf.f
wangnc> grep -s "test" dafds.f
wangnc>
egrep代表expression或extended grep,适情况而定。egrep接受所有的正则表达式,egrep的一个显著特性是可以以一个文件作为保存的字符串,然后将之传给egrep作为参数,为此使用- f开关。
wangnc> vi testfile
wangnc> pg testfile
484
47
wangnc> egrep -f testfile data.f
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
484 nov 7PL1996 CAD 49.00 PLV2C 234
如果要查询存储代码32L或2CC,可以使用(|)符号,意即“|”符号两边之一或全部。
egrep '(3ZL|2CC)' data.f




join用来将来自两个分类文本文件的行连在一起。下面讲述join工作方式。这里有两个文件file1和file2,当然已经分类。每个文件里都有一些元素与另一个文件相关。由于这种关系,join将两个文件连在一起,这有点像修改一个主文件,使之包含两个文件里的共同元素。文本文件中的域通常由空格或tab键分隔,但如果愿意,可以指定其他的域分隔符。类似于数据库中的join。
其一般格式为:
join [options] input-file1 input-file2
让我们看看它的可用选项列表:
an 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:
例子:
wangnc> pg name.txt
M.Golls 12 Hidd Rd
P.Heller The Acre
P.Willey 132 The Grove
T.Norms 84 Connaught Rd
K.Fletch 12 Woodlea
wangnc> pg town.txt
M.Golls Norwich NRD
P.Willey Galashiels GDD
T.Norms Brandon BSL
K.Fletch Mildenhall MAF
wangnc>
连接两个文件,使得名字支持详细地址。例如M . G o l l s记录指出地址为12 Hidd Rd。连接域为域0—名字域。因为两个文件此域相同, join将假定这是连接域:
wangnc> join name.txt town.txt
M.Golls 12 Hidd Rd Norwich NRD
P.Willey 132 The Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
好,工作完成。缺省join删除或去除连接键的第二次重复出现,这里即为名字域。
如果一个文件与另一个文件没有匹配域时怎么办?这时join不可以没有参数选项,经常指定两个文件的- a选项。下面的例子显示匹配及不匹配域。
wangnc> join -a1 -a2 name.txt town.txt
M.Golls 12 Hidd Rd Norwich NRD
P.Heller The Acre
P.Willey 132 The Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
使用- o选项选择连接域。例如要创建一个文件仅包含人名及城镇, join执行时需要指定显示域。方式如下:
使用1 . 1显示第一个文件第一个域,2 . 2显示第二个文件第二个域,其间用逗号分隔。命令为:
wangnc> join -o 1.1,2.2 name.txt town.txt
M.Golls Norwich
P.Willey Galashiels
T.Norms Brandon
K.Fletch Mildenhall
使用-jn m进行其他域连接,例如用文件1域3和文件2域2做连接键,命令为:
join -j1 3 -j2 2 file1 file2
使用join应注意连接域到底是哪一个,比如说你认为正在访问域4,但实际上join应该访问域5,这样将不返回任何结果。如果是这样,用awk检查域号。
例如,键入$awk '{print $4}'文件名,观察其是否匹配假想域。




sed是一个强大的文本过滤工具。使用sed可以从文件或字符串中抽取所需信息。
sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。Vi也是一个文本编辑器。sed可以随意编辑小或大的文件,有许多sed命令用来编辑、删除,并允许做这项工作时不在现场。sed一次性处理所有改变,因而变得很有效,对用户来讲,最重要的是节省了时间。使用sed需要记住的一个重要事实是,无论命令是什么, sed并不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。
打印第2行:(p表示显示行,-n表示只显示匹配行)
sed -n '2p' data.f
现打印1到3行,用逗号分隔行号:
sed -n '1,3p' data.f
模式匹配行:
sed -n '/USP/'p data.f 同 awk '$0~/USP/' data.f
使用4,/USP/。意即只在第四行查询模式the:???
sed -n '4,/USP/'p data.f
要打印整个文件,只需将行范围设为第一行到最后一行1 , $。$意为最后一行:
sed -n '1,$p' data.f
要打印文件第一行,使用行号:
sed -n '1p' data.f
要打印最后一行,使用$。$是代表最后一行的元字符:
sed -n '$p' data.f
要打印行号,使用等号=。打印模式匹配的行号,使用格式/pattern/ =
sed -n '/USP/=' data.f
打印模式匹配的行号及其所有内容,使用-e
sed -e '/USP/=' data.f
如果只打印行号及匹配行,必须使用两个sed命令,并使用e选项。第一个命令打印模式匹配行,第二个使用=选项打印行号,格式为sed -n -e /pattern/p -e /pattern/=
sed -n -e '/USP/p' -e '/USP/=' data.f





sort命令的一般格式为:
sort -cmu -o output_file [other options] +pos1 +pos2 input_files
下面简要介绍一下sort的参数:
-c 测试文件是否已经分类。
-m 合并两个分类文件。
-u 删除所有复制行。
-o 存储sort结果的输出文件名。
其他选项有:
-b 使用域进行分类时,忽略第一个空格。
-n 指定分类是域上的数字分类。
-t 域分隔符;用非空格或tab键分隔域。
-r 对分类次序或比较求逆。
+n n为域号。使用此域号开始分类。
n n为域号。在分类比较时忽略此域,一般与+n一起使用。
post1 传递到m,n。m为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7个字符开始。
最基本的sort方式为sort filename,按第一域进行分类(分类键0)。实际上读文件时sort操作将行中各域进行比较,这里返回基于第一域sort的结果:
sort -t: /etc/passwd > passwd.bak
如果要逆向sort结果,使用- r选项。在通读大的注册文件时,使用逆向sort很方便。下面是按域0分类的逆向结果:
sort -t: -r /etc/passwd > passwd.bak
有时需要只按第2域(分类键1)分类。这里为重排报文中供应区代码,使用t 1,意义为按分类键1分类:
sort -t: +1 /etc/passwd > passwd.bak
如果是数值域,即为数值分类,可以使用- n选项:
sort -t: +2n /etc/passwd > passwd.bak
有时,原文件中有重复行,这时可以使用- u选项进行唯一性(不重复)分类以去除重复行:
sort -u /etc/passwd > passwd.bak
可以指定分类键次序。先以第4域,再以第1域分类,命令为-k4 -k1
sort -t: -k4 -k1 /etc/passwd > passwd.bak
sort还可以用于d f命令,以递减顺序打印使用列下面是按占用空间百分比,第4+1域)
df | sort -r +4





split用来将大文件分割成小文件。有时文件越来越大,传送这些文件时,首先将其分割可能更容易。使用vi或其他工具诸如sort时,如果文件对于工作缓冲区太大,也会存在一些问题。因此有时没有选择余地,必须将文件分割成小的碎片。
split命令一般格式:
split -output_file-size input-filename output-filename
这里output-file-size指的是文本文件被分割的行数。split查看文件时,output-file-size选项指定将文件按每个最多1000行分割。如果有个文件有2800行,那么将分割成3个文件,分别有1000、1000、800行。每个文件格式为x[aa]到x[zz],x为文件名首字母, [aa]、[zz]为文件名剩余部分顺序字符组合。
例子:
test> ll
total 81
-rw-rw-r-- 1 wangnc users 82029 Aug 24 16:28 myfile
test> wc -l myfile
2082 myfile
test> split myfile
test> ll
total 162
-rw-rw-r-- 1 wangnc users 82029 Aug 24 16:28 myfile
-rw-rw-r-- 1 wangnc users 39633 Aug 24 16:29 xaa
-rw-rw-r-- 1 wangnc users 40481 Aug 24 16:29 xab
-rw-rw-r-- 1 wangnc users 1915 Aug 24 16:29 xac
按每个文件2行分割,命令为:
mydir3> ls
myfile
mydir3> wc -l myfile
2 myfile
mydir3> vi myfile
mydir3>
mydir3> wc -l myfile
7 myfile
mydir3> split -2 myfile
mydir3> ll
total 5
-rw-rw-r-- 1 wangnc users 102 Aug 24 16:33 myfile
-rw-rw-r-- 1 wangnc users 29 Aug 24 16:33 xaa
-rw-rw-r-- 1 wangnc users 29 Aug 24 16:33 xab
-rw-rw-r-- 1 wangnc users 30 Aug 24 16:33 xac
-rw-rw-r-- 1 wangnc users 14 Aug 24 16:33 xad





用户可以使用shell脚本创建交互性的、专业性强的屏幕输出。要实现这一点,系统上需要一个彩色监视器和tput命令。tput使用文件/etc/terminfo或/etc/termcap,这样就可以在脚本中使用终端支持的大部分命令了。
在使用tput前,需要在脚本或命令行中使用tput命令初始化终端。
$ tput init
tput产生三种不同的输出:字符型、数字型和布尔型(真/假)。
下面是大部分常用字符串:
bel 警铃
blink 闪烁模式
bold 粗体
civis 隐藏光标
clear 清屏
cnorm 不隐藏光标
cup 移动光标到屏幕位置( x,y)
el 清除到行尾
ell 清除到行首
smso 启动突出模式
rmso 停止突出模式
smul 开始下划线模式
rmul 结束下划线模式
sc 保存当前光标位置
rc 恢复光标到最后保存位置
sgr0 正常屏幕
rev 逆转视图
以下是大部分常用数字输出:
cols 列数目
it tab设置宽度
lines 屏幕行数
在tput中只有两种布尔操作符:
chts 光标不可见
hs 具有状态行




tr用来从标准输入中通过替换或删除操作进行字符转换。tr主要用于删除文件中控制字符或进行字符转换。使用tr时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。tr刚执行时,字符串1中的字符被映射到字符串2中的字符,然后转换操作开始。
带有最常用选项的tr命令格式为:
tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] input-file
这里:
-c 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
Input-file是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。
例子:
wangnc> pg oops.txt
And the cowwwwws went homeeeeeeee
Or did theyyyy
如果要去除重复字母或将其压缩在一起,使用- s选项。因为都是字母,故使用[a-z]。输入文件重定向到tr命令。
wangnc> tr -s "[a-z]"  echo "May Day,May Day,Going Down.." | tr "[a-z]" "[A-Z]"
MAY DAY,MAY DAY,GOING DOWN..
wangnc> echo "May Day,May Day,Going Down.." | tr "[A-Z]" "[a-z]"
may day,may day,going down..
将文本文件从小写转换为大写并将结果存入一个新文件,格式为:
cat file-to-translate | tr "[a-z]" "[A-Z]" > new-file-name
命令tr -cs "[a-z][A-Z]" "[\012*]"将文件每行所有不包含在[a-z]或[A-Z](所有希腊字母)的字符串放在字符串1中并转换为一新行。-s选项表明压缩所有新行, -c表明保留所有字母不动。
tr的第一个功能就是转换控制字符,特别是从dos向UNIX下载文件时,忘记设置ftp关于回车换行转换的选项时更是如此。
如果需要删除文件中^M,并代之以换行。使用命令:
tr -s "[\015]" "\n"





uniq用来从一个文本文件中去除或禁止重复行。可以认为uniq有点像sort命令中唯一性选项。对,在某种程度上讲正是如此,但两者有一个重要区别。sort的唯一性选项去除所有重复行,而uniq命令并不这样做。重复行是什么?在uniq里意即持续不断重复出现的行,中间不夹杂任何其他文本.
命令一般格式:
uniq -u d c -f input-file output-file
其选项含义:
-u 只显示不重复行。
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数。
-f n为数字,前n个域被忽略。
一些系统不识别-f选项,这时替代使用-n。
wangnc> pg myfile.txt
May Day
May Day
May Day
Going Down
May Day
wangnc> uniq myfile.txt > myfile.txt.1
wangnc> pg myfile.txt.1
May Day
Going Down
May Day
wangnc> sort -u myfile.txt > myfile.txt.2
wangnc> pg myfile.txt.2
Going Down
May Day
wangnc>
使用-c选项显示行数,即每个重复行数目:
uniq -c myfile.txt
使用-d显示重复出现的不唯一行:
uniq -d myfile.txt
使用-n只测试一行一部分的唯一性。例如-5意即测试第5域后各域唯一性。域从1开始记数。
如果忽略第1域,只测试第2域唯一性,使用-n2。








本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/43842/showart_366550.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP