Archive for the ‘Shell学习笔记’ category

cut命令和paste命令

19 1 月, 2011
cut命令

顾名思义,cut命令就是从文本文件或从某个命令的输出数据中裁剪(析取)出想要的数据域。cut命令一般使用的方式为:

cut -cchars file

其中,-cchar中的-c为cut命令的常用选项,表示从file文件的每一行中都cut出chars这段文字。。chars的取值较为灵活,分为以下几种情况。

cut -c5 file:析取file文件每行的第5个字符;

cut -c5,7 file:析取file文件每行第5和第7个字符;

cut -c6-8 file:析取file文件每行第6到第8个字符;

cut -c6- file:析取file文件每行第6个到行尾之间的字符;

cut -c-3 file:析取file文件每行行首到第三个字符之间的字符;

如果cut命令中未指定file,则将标准输入作为cut命令的析取对象。比如:

edsionte@edsionte-desktop:~$ ls -l
总用量 1680
drwx------  2 edsionte edsionte   4096 2011-01-10 20:38 android_code
-rwxrwxrwx  1 edsionte edsionte   7138 2011-01-13 08:42 a.out
drwxr-xr-x  2 edsionte edsionte   4096 2011-01-16 21:46 assembly
drwxr-xr-x  2 edsionte edsionte   4096 2011-01-11 09:58 bin
drwx------ 24 edsionte edsionte   4096 2011-01-17 11:35 code
edsionte@edsionte-desktop:~$ ls -l | cut -c1-9
总用量
drwx-----
-rwxrwxrw
drwxr-xr-
drwxr-xr-
drwx-----

上述cut命令中,将ls命令的输出作为cut命令的输入。产生的结果是析取出每列数据的第1到第9个字符,也既是每个文件的访问权限。下面的例子通过逗号隔开两个数值列表,分别析取出文件访问权限和文件名。

edsionte@edsionte-desktop:~$ ls -l
总用量 1680
drwx------  2 edsionte edsionte   4096 2011-01-10 20:38 android_code
-rwxrwxrwx  1 edsionte edsionte   7138 2011-01-13 08:42 a.out
drwxr-xr-x  2 edsionte edsionte   4096 2011-01-16 21:46 assembly
drwxr-xr-x  2 edsionte edsionte   4096 2011-01-11 09:58 bin
drwx------ 24 edsionte edsionte   4096 2011-01-17 11:35 code
edsionte@edsionte-desktop:~$ ls -l | cut -c1-9,56-
总用量
drwx----- android_code
-rwxrwxrw a.out
drwxr-xr- assembly
drwxr-xr- bin
drwx----- code

-d和-f选项

通过上述的例子可以看到,如果单纯使用-c选项,则必须很清楚所要解析字符在每行中的位置;另外,-c选项适用从格式固定的文件或命令输出中解析出所需要的字符。如果文件数据的组织格式不固定,则很难使用-c选项从每行中都解析出所需的字符。

比如我们常常会遇到这样的个人信息,包含姓名,性别,城市,爱好,电话:

edsionte:male:xian:music:18717375182
zhyun:famle:beijing:basketball:18654737473
liting:male:zhangjiajie:tableball:15784859345

现在如果要解析出姓名,使用-c选项则不可能做到。不过该文件有一个特点,每行信息中的每个字段都使用分号隔开,此时我们就可以使用-f和-d选项:

cut -ddchar -ffields file

dchar表示我们析取字段时所依据的分隔符;fields标示我们所要析取的字段序号,可用逗号隔开多个字段序号。对于上面的例子,我们可以这么做:

edsionte@edsionte-laptop:~/shelltest$ cut -d: -f1 info
edsionte
zhyun
liting

cut命令将制表符(\t)作为默认的字段分隔符,如果某个文件用制表符作为每行各个字段的分隔符,则使用cut -ffield file即可析取相应字段。

paste命令

与cut命令相反,paste命令可以将多个文件对应行的数据连接在一起,数据之间使用制表符隔开。合并后的结果默认在标准输出中输出。该命令基本使用方法为:

paste files

比如将下面的name和gender合并在一起:

edsionte@edsionte-desktop:~/shelltest$ cat name
edsionte
wangsen
zhanyu
edsionte@edsionte-desktop:~/shelltest$ cat gender
m
m
f
f
m
edsionte@edsionte-desktop:~/shelltest$ paste name gender
edsionte	m
wangsen	m
zhanyu	f
	f
	m

可以看到,由于name文件中只有三行数据,因此gender文件中最后两行和空字符合并在一起。

-d选项

通过-d选项可以指定任意分隔符来隔开不同文件每行的内容,基本使用方法为:

paste -dchars files

dchar可以取多个分隔符,每个分隔符依次隔开files中每个文件每行的数据。比如:

edsionte@edsionte-desktop:~/shelltest$ paste -d~, name gender number
edsionte~m,123
wangsen~m,456
zhanyu~f,789
~f,
~m,

从这个例子也可以看出,name和number文件的第4和第5行的数据均为空。

-s选项

通过这个选项可以将一个文件每行的数据都合并在一起。比如:

edsionte@edsionte-desktop:~/shelltest$ ls
file1  file3  file5  file7  gender  number
file2  file4  file6  file8  name
edsionte@edsionte-desktop:~/shelltest$ ls | paste -s -d@
file1@file2@file3@file4@file5@file6@file7@file8@gender@name@number

对于上述两个命令,使用-d选项时最好将分隔符放在单引号中。原因很简单,比如:

edsionte@edsionte-desktop:~/shelltest$ ls | paste -s -d;
paste:选项需要一个参数 -- d
请尝试执行"paste --help"来获取更多信息。

原因是shell并没有将;作为分隔符,而是认为它是paste命令的结束标志。这里的原因跟转义字符差不多,因为此时我们需要使用;的本意。加上单引号即可成功执行上述命令:

edsionte@edsionte-desktop:~/shelltest$ ls | paste -s -d';'
file1;file2;file3;file4;file5;file6;file7;file8;gender;name;number

grep和正则表达式

16 10 月, 2010

这两天抽空看了一下正则表达式,随之也基本会用grep命令了。关于grep和正则表达式的具体使用,总结成文章如下。

什么是grep?

grep (Global search Regular Expression and Print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

什么是正则表达式?

正则表达式(Regular Express)就是由一系列特殊字符组成的字符串, 其中每个特殊字符都被称为元字符, 这些元字符并不表示为它们字面上的含义,而会被解释为一些特定的含义。

正则表达式的元字符

1.句点(.)

在正则表达式中,句点(.)可以匹配任何的单个字符。比如:

e.sionte:可以是edsionte,e#sionte,e7sionte等等;

ed…te:可以是edsionte,ed@wdte等

Try:

:%s/  a.d  /@/g

打开任意一个文本文件(本文中的所有命令都是使用这里的文章进行的测试),在vim命令状态下输入上述命令。这条命令的意思是:在所有行(%s代表所有行)中查找符合“  a.d  “的字符串(注意a前面和d后面均有一个空格),并且将符合条件的字符串替换成@;g代表将每一行中符合上述条件的所有字符串都做相应替换,否则只会替换每一行的第一个否和条件的字符串。在上述命令中,属于正则表达式的字符串为两个/之间的部分。

2.^符号

在正则表达式中,^符号表示跟行首进行匹配。比如:

edsionte is a good boy. edsionte likes eating.edsionte likes music.

^edsionte只会跟行首的edsionte进行匹配,而不是和位于行中的其他edsionte进行匹配。

Try:

:%s/^/      /

上述命令在一个文本文件的每行都插入五个空格。对于上述命令,在命令末尾加g和不加g作用是一样的。

3.美元符号($)

与^符号相反,美元符号($)代表跟行尾进行匹配。比如:

edsionte is eating a apple.edsionte will eat that pear.This cup of milk was drunk by edsionte.

edsionte$不会与末尾的edsionte进行匹配,因为这一行最后一个字符是句点(.)。而且它更不会与此行中其他两个edsionte进行匹配。同样的,对于上述命令,在命令末尾加g和不加g作用是一样的。

那么如何匹配行尾的句点?你会想到是这样:.$。不过,这个正则表达式表示的确实匹配行尾的任意的单字符。学过C语言的你,应该知道为什么了吧?我们上面说过正则表达式是由元字符组成,因此句点在正则表达式中不会代表它本身的意思。想要使用句点本身,即得在句点前加\。也就是说,\.$才会真正的匹配行尾的句点。这其实就是转义字符,got it?

Try:

:%s/..$//

删除每行的最后两个字符。

4.[…]结构

在正则表达式中,使用[…]来匹配包含在此结构中的一个字符。比如:

[Tt]he:不管是The还是the都否和匹配要求,这条正则表达式很好的处理了出现在行首的那些单词。但必须注意的是,在字符串“Ttheapple”中,使用上述正则表达式所匹配的是the,而不是Tthe。

[0123456789]:匹配的是任意一个数字,更简单的写法是[0-9]。

[^0-9]:匹配非数字的单字符。请注意这条正则表达式和^[0-9]的差异。

一些特殊的规则是,如果要匹配一个连字符,必须将连字符放在靠近左[的位置。如果方括号内有^必须将^放在所有匹配字符的前方,比如:

[-0-9]:匹配一个数字或者连字符。

[^-0-9]:匹配一个不是连字符或数字的字符。

Try:

:%s/[Hh]arry Potter[0-9]/HARRY POTTER/g

将诸如harry potter3、Harry potter5等这样的字符串都替换成HARRY POTTER。

:%s/HARRY POTTER/*harry potter*/g

将上一步替换后的字符串都换成*harry potter*。可能你会有这样的疑问:*,.,和^等这样的字符不是元字符吗,为什么这里可以直接使用*的本来意思?这是因为元字符只有在搜索串(也就是在正则表达式中)中才会有特殊意义,在替换串中则不会有特殊意义。

5.星号(*)

在正则表达式中,用星号来匹配零到多个紧靠在星号左边的那个字符。比如:

.*:表示零到多个任意字符。因为正则表达式总是寻求最大匹配,因此.*总是匹配一整行。

go*le:可以用来匹配gle,gole,goole,gooooooooooole等。

goo*le:最小的匹配为gole。

t.*t:匹配前后均为t的字符串,而且匹配的是最大长度的字符串。

Try:

:%s/  */ /g

将每一行中的一个到多个空格都全部换成一个空格。

:%s/[a-zA-Z][a-zA-Z]*//g

这个会有什么结果,试试就知道。

6.\{…\}结构

使用\{…\}这样的结构可以匹配精确数目的字符。比如:

t\{1,5\}:匹配1到5个连续的t。

[a-zA-Z]\{4,8\}:匹配4到8个连续的字母。

[0-9]\{8\}:匹配正好8个数字。

[a-z]\{4,\}:匹配至少4个连续的小写字母。

Try:

:%s/[a-z]\{5,\}/@/g

将至少5个连续的小写字母替换成@。

grep的使用

grep命令的基本使用方法是:grep 模式 文件名。文件中符合模式的字符串所在行均会被打印出来。比如:

grep include hello.c:即在hello.c中查找包含字符串include的那些行。

如何将上述我们所熟悉的正规表达式与grep命令结合起来?模式处即为正则表达式,并用单引号包含。比如:

grep ‘[Hh]arry [Pp]otter’ harry.txt:在harry.txt中查找harry potter所在的行,其中H和P是不区分大小写的。

另外,grep命令还有下面一些选项,可以使grep命令使用的更灵活。

-i:模式匹配时忽略大小写的差异;
-l:只输出匹配模式的文件名,而不打印匹配的行;
-q:匹配成功并不将结果在标准输出中显示;
-v:显示不符合模式的行;
-n:在匹配行前显示行号;

shell变量

2 10 月, 2010

正如大多数的计算机语言那样,shell变量只能以字母和下划线为变量名的起始,其后可跟任意长度的字母、数字和下划线。shell变量的赋值(或者说定义)方式可参考如下例子:

edsionte@edsionte-desktop:~$ fruit=apple

其中fruit就是进行赋值的变量,紧接着即为赋值符=,然后是新值(变量值)。注意,整个赋值语句中不能包含空格。此时你可能会有“如果我的新值中含有空格,那我如何赋值”的疑问,那么不用担心,你可以这样赋值:

edsionte@edsionte-desktop:~$ fruit=“north apple”

对了,就是对整个新值加上双引号。一个变量赋值完毕后,若要取出变量中的值,那么只需在此变量前加上$符号,比如:

edsionte@edsionte-desktop:~$ echo $fruit
north apple
edsionte@edsionte-desktop:~$ echo fruit
fruit

你看到了,通过在变量名前加$,可以取出此变量中的值;相反,以上面例子来说的话,如果只echo fruit,那么它只会显示这个变量名本身而不是显示变量的值。

了解了变量的基本的赋值规则,我们再来看下面的赋值语句:

edsionte@edsionte-desktop:~$ myfruit=$fruit
edsionte@edsionte-desktop:~$ echo $myfruit
north apple

将变量A作为另一个变量B的新值时,只需对变量A加$引用其值就可以了,不需再加引号(但加上也无妨)。

当多个变量赋值给一个变量时,可参考如下例子:

edsionte@edsionte-desktop:~$ mumfruit=pear
edsionte@edsionte-desktop:~$ dadfruit=banana
edsionte@edsionte-desktop:~$ familyfruit="$myfruit,$dadfruit,$mumfruit"
edsionte@edsionte-desktop:~$ echo $familyfruit
north apple,banana,pear

也就是说,多个变量需要加上引号。

OK,关于变量的基本要点就是这些,get it?

热身

1 10 月, 2010

一般开机后,我做的第一件事就是开终端,然后进入到我的代码目录下,查看该子目录下的所有文件。比如我最近在学习设备驱动,那么我会依次进入到下面的目录,而且最终会ls一下:

~/code/driver/myglobalmem/

这么虽然做没有什么意义,可是我想大多数人跟我一样,会有此类“强迫症”,那么我们可以将上面所操作的命令写成如下shell脚本:

#! /bin/sh

cd ~/code/driver/myglobalmem
ls -l

这样每次打开终端后,以.sriptname运行这个脚本文件,就可以到达你想要进的目录下了。

windows 7 ultimate product key

windows 7 ultimate product key

winrar download free

winrar download free

winzip registration code

winzip registration code

winzip free download

winzip free download

winzip activation code

winzip activation code

windows 7 key generator

windows 7 key generator

winzip freeware

winzip freeware

winzip free download full version

winzip free download full version

free winrar download

free winrar download

free winrar

free winrar

windows 7 crack

windows 7 crack

windows xp product key

windows xp product key

windows 7 activation crack

windows7 activation crack

free winzip

free winzip

winrar free download

winrar free download

winrar free

winrar free

download winrar free

download winrar free

windows 7 product key

windows 7 product key