LinuxSir.cn,穿越时空的Linuxsir!

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

这样的shell怎么写?[已解决]

[复制链接]
发表于 2004-3-24 12:26:02 | 显示全部楼层
最初由 home_king 发表
在shell里用IFS来分割域的,针对具有不规则"分割子"的行,Perl的split能胜任(因为它的分割子正是"\s+"),且代码精炼; 用shell则不然,即使awk也无能为力,最好自己写一个类似split的shell函数吧(shell语法我忘了大半,现在只能用Perl来帮你了,呵呵)。

awk的非常强大,只不过我们不太精通罢了!
 楼主| 发表于 2004-3-24 12:56:28 | 显示全部楼层
感谢各位了! javalee兄, 我试了你的code, 但不成功:
[root@localhost 09:37 PM #~/shell_script ] cat datafile1 | tr -d "'" | awk '{print $3, $5, $7, $NF}'| awk '{if($3!~/\//)print $1, $2, $NF;else print $0}'
bash: !~/\//: event not found
源码贴出后看不清楚。我想是我的语法错误。
georegk兄, 你的办法不行,因为我只是贴出了几行, 这个datafile 有5000行, 不用/usr/bin/下程序的有1000多。
嘿777,我不太明白你的意思, 能不能再解释一下...
发表于 2004-3-24 12:58:55 | 显示全部楼层
最初由 yongjian 发表
感谢各位了! javalee兄, 我试了你的code, 但不成功:
[root@localhost 09:37 PM #~/shell_script ] cat datafile1 | tr -d "'" | awk '{print $3, $5, $7, $NF}'| awk '{if($3!~/\//)print $1, $2, $NF;else print $0}'
bash: !~/\//: event not found
源码贴出后看不清楚。我想是我的语法错误。
georegk兄, 你的办法不行,因为我只是贴出了几行, 这个datafile 有5000行, 不用/usr/bin/下程序的有1000多。
嘿777,我不太明白你的意思, 能不能再解释一下...

这是一行命令,是不是用鼠标粘贴的缘故吧?
 楼主| 发表于 2004-3-24 13:00:40 | 显示全部楼层
还有'sss'也只是取代了数据(数据我不能贴出), 实际上的'sss'段的内容是不同的,只是这项一直在第三的位置,所以我就用了个'sss'.
 楼主| 发表于 2004-3-24 13:02:01 | 显示全部楼层
没有, 我是输入的。是!~/\//报错。是不是有空格什么的, 我输入是没有输入空格,因为我看不清。
发表于 2004-3-24 13:11:15 | 显示全部楼层
***
/home/javalee:cat p
cat datafile|tr -d "'"|awk '{print $3,$5,$7,$NF}'|awk '{if($3!~/\//)print $1,$2,$NF;else print $0}'
***
那个折页符\不要输入的
发表于 2004-3-24 13:12:29 | 显示全部楼层
最初由 yongjian 发表
感谢各位了! javalee兄, 我试了你的code, 但不成功:
[root@localhost 09:37 PM #~/shell_script ] cat datafile1 | tr -d "'" | awk '{print $3, $5, $7, $NF}'| awk '{if($3!~/\//)print $1, $2, $NF;else print $0}'
bash: !~/\//: event not found
源码贴出后看不清楚。我想是我的语法错误。
georegk兄, 你的办法不行,因为我只是贴出了几行, 这个datafile 有5000行, 不用/usr/bin/下程序的有1000多。
嘿777,我不太明白你的意思, 能不能再解释一下...

那麼先找 '/ 和 ---- 行不行?
发表于 2004-3-24 13:30:55 | 显示全部楼层
在你的shell code里调用我的perl脚本即可。
shell-code: shell1

  1. #!/bin/sh
  2. if [ -e "$1" -a -x "$1" -a -e "datafile" -a -r "datafile" ] ; then
  3.    ./$1 datafile
  4. fi
复制代码

perl-code: prog

  1. #! /usr/bin/perl -w

  2. if ($_=shift @ARGV){
  3. die "No vaild file to read($!)."
  4.     unless -e $_ and -r $_;
  5. }
  6. else{
  7.     print STDERR "No argument is supplied!\n";
  8.     exit(1);
  9. }

  10. open OBJFILE, "$_"
  11.     or die "Error!!!($!).";
  12. while (<OBJFILE>){
  13.     foreach (split){
  14.         if (/(\bsss\b)/){
  15.             print "$1 ";
  16.         }
  17.         if (m{(/.*\b)}){
  18.             print "$1 ";
  19.         }
  20.         if (m{----\w+}){
  21.             print "$_\n";
  22.         }
  23.     }
  24. }
复制代码

  1. [root@home root]# ./shell1 prog
  2. sss /usr/bin/aaa ----first1
  3. sss /usr/bin/bbb ----first2
  4. sss /usr/bin/ccc ----first3
  5. sss /usr/sbin/ddd ----first4
  6. sss /usr/bin/aaa ----first5
  7. sss /usr/bin/ccc ----first6
  8. sss /usr/bin/eee ----first7
  9. sss /usr/bin/ddd /root/httplog.html ----first8
  10. sss /usr/bin/ddd /root/sshdlog.html ----first9
复制代码

当然,如果要输出为中间结果,那么改变perl script里面的print的定向文件句柄即可,这里不獒述了。
发表于 2004-3-24 14:47:08 | 显示全部楼层
  1. sed -r "s/^[^']*('[^']*){4}'([^']*)'.* -a[^']'([^']*)'.* (.*$)/\2 \3 \4/"  
复制代码
发表于 2004-3-24 15:12:26 | 显示全部楼层
最初由 r2007 发表
  1. sed -r "s/^[^']*('[^']*){4}'([^']*)'.* -a[^']'([^']*)'.* (.*$)/\2 \3 \4/"  
复制代码

精彩~~~,请问那个sed -r 代表什么意思?
我测试结果:
sss /usr/bin/aaa ----first1
sss /usr/bin/bbb ----first2
sss /usr/bin/ccc ----first3
sss /usr/sbin/ddd ----first4
sss /usr/bin/aaa ----first5
sss /usr/bin/ccc ----first6
sss /usr/bin/eee ----first7
sss /usr/bin/ddd http /root/httplog.html ----first8
sss /usr/bin/ddd sshd /root/sshdlog.html ----first9
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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