LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: KornLee

grep,sed,awk命令实例大练习[整理]

[复制链接]
 楼主| 发表于 2003-8-14 12:02:04 | 显示全部楼层
grep ^# urfile
sed -n '/^#/p' urfile
发表于 2004-2-5 11:18:59 | 显示全部楼层
太爽了,真是难得的好帖.顶!!!!!!
发表于 2004-7-19 23:22:07 | 显示全部楼层
awk 练习:
1.显示所有电话号码
  1. $ awk -F: '{print $2}' awk-datafile
复制代码


2.显示Dan的电话号码
  1. awk -F: '/Dan/{print $2}' awk-datafile
复制代码


3.显示Susan的名字和电话号码
  1. $ awk -F: '/Susan/{print $1,$2}' awk-datafile
复制代码


4.显示所有以D开头的姓
  1. $ awk -F: '/.D/{print $1}' awk-datafile |awk -F" " '{print $2}'
复制代码


5.显示所有以一个C或E开头的名
  1. $ awk -F: '/^C./{print $1}/^E./{print $1}' awk-datafile|awk -F" " '{print $1}'
复制代码


6.显示所有只有四个字符的名
  1. $ awk -F":" '{print $1}' awk-datafile|awk -F" " 'length($1) == 4{print $1}'
复制代码


7.显示所有区号为916的人名
  1. $ awk -F":" '/(916)/{print $1}' awk-datafile
复制代码


8.显示Mike的捐款.显示每个值时都有以$开头.如$250$100$175
  1. $ awk -F":" '/Mike/{print "$"$3," $"$4," $"$5}' awk-datafile
复制代码


9.显示姓,其后跟一个逗号和名,如Jody,Savage
  1. $ awk -F":" '{print $1}' awk-datafile |awk -F" " '{print $2", "$1}'
复制代码


10.写一个awk的脚本,它的作用:
.显示Savage的全名和电话号码
.显示Chet的捐款
.显示所有头一个月捐款$250的人名
  1. BEGIN {
  2.         FS=":"
  3. }
  4. {
  5.         if($1~/Savage/){print $1,$2}
  6.         if($1~/Chet/){print $3,$4,$5}
  7.         if($3==250){print $1}
  8. }

复制代码


请教个问题:-F: 和 -F":"都可以达到以“:”作为段分隔符的作用,那个规范的写法?
发表于 2004-7-22 00:30:48 | 显示全部楼层
sed练习:
1,把Jon's的名字改成Jonathan

  1. $ sed -e 's/Jon/Jonathan/' sed-datafile
复制代码

2,删除头三行

  1. $ sed -e '1,3d' sed-datafile
复制代码

3,显示5-10行

  1. $ sed -ne '5,10p' sed-datafile
复制代码

4,删除包含Lane的行

  1. sed -e '/Lane/d' sed-datafile
复制代码

5,显示所有生日在November-December之间的行

  1. $ sed -ne '/\(1[1-2]\)\/\([0-9]*\)\/\([0-9]*\)/p' sed-datafile
  2. $ sed -ne '/[:::]1[1-2]["/":]/p' sed-datafile
  3. $ sed -ne '/[:::]1[1-2][/:]/p' sed-datafile
  4. $ sed -ne '/[:::]1[1-2][//:]/p' sed-datafile
  5. $ sed -ne '/[:::]1[1-2][//]/p' sed-datafile
  6. $ sed -ne '/[:::]1[1-2]\//p' sed-datafile
复制代码

这几个好像都行:ask
6,把三个星号(***)添加到也Fred开头的行

  1. $ sed -e 's/^Fred/***Fred/' sed-datafile
  2. $ sed -e 's/^Fred/***&/' sed-datafile
复制代码

7,用JOSE HAS RETIRED取代包含Jose的行

  1. $ sed -e 's/^Jose.*$/JOSE HAS RETIRED/g' sed-datafile
  2. $ sed -e '/^Jose/c\JOSE HAS RETIRED/' sed-datafile
复制代码

8,把Popeye的生日改成11/14/46

  1. $ sed -e '/^Popeye/s:\([0-9]*\)\/\([0-9]*\)\/\([0-9]*\):11/14/46:' sed-datafile
复制代码

9,删除所有空白行

  1. $ sed -e '/^$/{N;s/\n//}' sed-datafile
  2. $ sed -e '/^$/d' sed-datafile
复制代码

10,写一个脚本,将:
.在第一行之前插入标题PERSONNEL FILE.
.删除以500结尾的工资
.显示文件内容,把姓和名颠倒
.在文件末尾添加THE END

  1. 1i\PERSONNEL FILE
  2. s/[0-9]*500$//g
  3. s/^\([[:alpha:]]*\)\ \([[:alpha:]]*\)/\2, \1/
  4. $a\THE END
复制代码
 楼主| 发表于 2004-7-22 00:42:02 | 显示全部楼层
-F: 和 -F":"都可以达到以“:”作为段分隔符的作用,那个规范的写法?[/quote

在BEGIN块里指定FS,是必须要双引号的,而命令行里,作为awk选项的-F,
如果分割符是一般字符,也是不需要用引号来括引的!
这几个好像都行

一个问题,多种解决方法,这在unix/linux里,不奇怪!
发表于 2004-7-22 09:24:09 | 显示全部楼层
请教斑竹一下,
如果匹配一串字母,如Alpha
是使用那种形式规范些呢?
1, [[:alpha:]]*
2, [a-zA-Z]*
还有1里面的两次[]难道就不能代表多个字母了吗?为什么不加*就无法匹配?
发表于 2004-7-22 11:06:15 | 显示全部楼层
最初由 aaccdd 发表
请教斑竹一下,
如果匹配一串字母,如Alpha
是使用那种形式规范些呢?
1, [[:alpha:]]*
2, [a-zA-Z]*
还有1里面的两次[]难道就不能代表多个字母了吗?为什么不加*就无法匹配?

[[:alpha:]]这类写法遵循POSIX标准,具有很好的平台无关性,而且类似如此的POSIX字符类也是旧正则表达式所不具备的。

[character set]字符类代表character set(字符集)里的任意一个字符。

ps:正则表达式是awk与sed的灵魂
发表于 2004-7-22 21:11:42 | 显示全部楼层
grep练习:
1.显示所有包含San的行
  1. $ grep San grep-datafile
复制代码

2.显示所有以J开始的人名所在的行
  1. $ grep ^J grep-datafile
复制代码

3.显示所有以700结尾的行
  1. $ grep 700$ grep-datafile
复制代码

4.显示所有不包括834的行
  1. $ grep -v 834 grep-datafile
复制代码

5.显示所有生日在December的行
  1. $ grep "12/\(.*\)/\(.*\)" grep-datafile
  2. $ grep "12\/\([[:digit:]]*\)\/\([[:digit:]]*\)" grep-datafile
复制代码

6.显示所有电话号码的区号为408的行(原题498没有那个号)
  1. $ grep 408 grep-datafile
  2. $ grep ":408-.*" grep-datafile
复制代码

7.显示所有这样的行:它包含一个大写字母,后跟四个小写字母,一个冒号,一个空格,和一个大写字母
  1. $ grep "[[:upper:]][[:lower:]]\{4\}: [[:upper:]]" grep-datafile
  2. $ grep "[A-Z][a-z]\{4\}: [A-Z]" grep-datafile
复制代码

8.显示姓以K或k开头的行
  1. $ grep "^K\|\w\+ K" grep-datafile
复制代码

9.显示工资为六位数的行,并在前面加行号
  1. $ grep -n  "[[:digit:]]\{6\}$" grep-datafile
  2. $ grep -n "[::::][[:digit:]]\{6\}" grep-datafile
复制代码

10.显示包括Lincoln或lincoln的行,并且grep对大小写不敏感
  1. $ grep -i "Lincoln" grep-datafile
复制代码
发表于 2004-7-22 21:22:39 | 显示全部楼层
请教斑竹两个问题:
1,表示多个正则表达式(group regular expression)的符号"()"什么时候需要添加?
有什么原则吗?

2,grep 的选项-B num和 -A num是什么用途?另外,看manpage,
上面说-A是在匹配行之后打印num行的追踪信息(?)-B num是在匹配之前打印;
但是我试了一下,似乎相反?
-A 是匹配行之前有 --;-B 却是之后有--。

ps grep -V
grep (GNU grep) 2.5.1
发表于 2004-11-7 13:53:49 | 显示全部楼层
sed -e "s/^\(.*\) \(.*\):[0-9]\{3\}-\(.*\)$/\2 \1:\3/g"
datafield
这个也可以将姓和名颠倒
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表