LinuxSir.cn,穿越时空的Linuxsir!

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

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

[复制链接]
发表于 2004-3-24 15:22:43 | 显示全部楼层
  1. In basic regular expressions the metacharacters ?, +, {, |,  (,  and  )
  2. lose  their  special  meaning; instead use the backslashed versions \?,
  3. \+, \{, \|, \(, and \).
复制代码

-r 这些特殊字符不用转义。
 楼主| 发表于 2004-3-24 23:05:54 | 显示全部楼层
强啊!佩服。r2007兄的方法很爽啊, 就一句sed搞定了我两三天都想不出的方法。我就用你介绍的方法了,虽然看不太懂。sed和awk真要多多学习。我原来用的方法类似于javalee兄, 用的是sed和awk组合,但当时我不知道$NF可以显示最后一域,更别说-a后的那项。 不过我还是想请教一下javalee兄, 折页符“\"我没有输入, 问题是在(if($3!~/\//)上, bash不认"!~/\//",不知是怎么回事。
发表于 2004-3-25 00:09:37 | 显示全部楼层
最初由 yongjian 发表
强啊!佩服。r2007兄的方法很爽啊, 就一句sed搞定了我两三天都想不出的方法。我就用你介绍的方法了,虽然看不太懂。sed和awk真要多多学习。我原来用的方法类似于javalee兄, 用的是sed和awk组合,但当时我不知道$NF可以显示最后一域,更别说-a后的那项。 不过我还是想请教一下javalee兄, 折页符“\"我没有输入, 问题是在(if($3!~/\//)上, bash不认"!~/\//",不知是怎么回事。

跟shell有什么关系! 贴出你awk的版本!
 楼主| 发表于 2004-3-25 00:12:04 | 显示全部楼层
又有新问题, r2007兄的代码在列子文件中运行ok, 我后来拿到真实datafile里运行,才发现有些行是没有末尾的“----xxxx"的(大概不到100行)。所以输出了”----xxxx"前的一域。如: "sss /usr/bin/jjj 14:10\". 因为这一行没有“----xxxx",所以”14:10\"就成了最后一域。 我想如果在r2007兄的输出基础上再用“|" 将所有以"\"结尾的行的最后一域去掉,就是最终需要的结果了。(因为从r2007兄的代码输出显示的结果来看, 凡是没有以"----xxxxx" 结尾的行都是以“时间\"结尾, 所以如果能去掉这个”时间\", 就ok了。
再给出一个比较完整的列子:
------------------------------------------------------------------------------------------
'abc' 'abc' 'sss' -a '/usr/bin/aaa' -t '005' -s '030' ----first1
'abc' 'abc' 'sss' -a '/usr/bin/bbb' +d -t '005' -s '010' ----first2
'abc' 'abc' 'sss' -a '/usr/bin/ccc' +d -h -t '005' -s '111' ----first3
'abc' 'abc' 'sss' -a '/usr/sbin/ddd' -t '5' -s\ ----first4
'abc' 'abc' 'sss' -a '/usr/bin/aaa' +C +d -t '005' -s '090' ----first5
'abc' 'abc' 'sss' -a '/usr/bin/ccc' -t '5' -s '111' ----first6
'abc' 'abc' 'sss' -a '/usr/bin/eee' +d -t '005' -s\ ----first7
'abc' 'abc' 'sss' -a '/usr/bin/ddd http /root/httplog.html' -t '010' -s '010' ----first8
'abc' 'abc' 'sss' -a '/usr/bin/ddd sshd /root/sshdlog.html' -t '005' -s '010' ----first9
'abc' 'abc' 'sss' -p '192.168.0.1' -a '/usr/bin/qqq start' -t '010 200' -s '001' ----first10
'abc' 'abc' 'sss' -p '10.10.100.1 255.255.254.1' -a '/lcf/bin/zzz start' -t '101 222' -s '010' ----first11
'abc' 'abc' 'sss' -a '/usr/bin/jjj status' -t '001 101' -s '14:10\"
---------------------------------------------------------------------------------------------

输出结果的列子如:
sss /usr/bin/aaa ----first1               #有----结尾
sss /lcf/bin/jjj                              #没有----结尾

在此感谢大家的帮助了!
 楼主| 发表于 2004-3-25 00:14:08 | 显示全部楼层
[root@dyn167515bld shell_scripts]# awk -W version
GNU Awk 3.1.3
[root@dyn167515bld shell_scripts]# sed -V
GNU sed version 4.0.8
[root@dyn167515bld shell_scripts]# bash --version
GNU bash, version 2.05b.0(1)-release (i386-redhat-linux-gnu)
 楼主| 发表于 2004-3-25 00:18:16 | 显示全部楼层
javalee兄, 之所以认为是shell的问题是因为运行后的报错是:
--------------------------------------------------
bash: !~/\//: event not found
--------------------------------------------------
发表于 2004-3-25 01:47:43 | 显示全部楼层
  1. /home/javalee:cat p
  2. cat datafile|awk '{print $3,$5,$7,$NF}'|\
  3. awk '{if($3!~/\//)print $1,$2,$NF;else print $0}'|\
  4. sed -e "s/'//g" -e 's/[0-9]\{1,\}:[0-9]\{1,\}[\]"//g'
  5. /home/javalee:ksh p
  6. sss /usr/bin/aaa ----first1
  7. sss /usr/bin/bbb ----first2
  8. sss /usr/bin/ccc ----first3
  9. sss /usr/sbin/ddd ----first4
  10. sss /usr/bin/aaa ----first5
  11. sss /usr/bin/ccc ----first6
  12. sss /usr/bin/eee ----first7
  13. sss /usr/bin/ddd /root/httplog.html ----first8
  14. sss /usr/bin/ddd /root/sshdlog.html ----first9
  15. sss 192.168.0.1 /usr/bin/qqq ----first10
  16. sss 10.10.100.1 ----first11
  17. sss /usr/bin/jjj
复制代码
是这样的结果么?
ps:你的awk和sed的版本都比我高!
 楼主| 发表于 2004-3-25 02:23:45 | 显示全部楼层
谢谢javalee. 不过好象你的倒数第二行和三行的输出不对. sss 后应是-a 后没有了单引号的内容, 你的输出却是IP地址了.
发表于 2004-3-25 02:55:14 | 显示全部楼层
最初由 yongjian 发表
谢谢javalee. 不过好象你的倒数第二行和三行的输出不对. sss 后应是-a 后没有了单引号的内容, 你的输出却是IP地址了.

看这个是否可以~~~
  1. /home/javalee:cat pp
  2. cat datafile|tr ' ' '\n'|tr -d "'"|sed -n '/^sss/p;/^\//p;/^----/p'|\
  3. tr '\n' ' '|sed 's/sss/\
  4. sss/g'
  5. echo
复制代码
result:
/home/javalee:ksh pp

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 /root/httplog.html ----first8
sss /usr/bin/ddd /root/sshdlog.html ----first9
sss /usr/bin/qqq ----first10
sss /lcf/bin/zzz ----first11
sss /usr/bin/jjj
发表于 2004-3-25 03:25:50 | 显示全部楼层
这个样子?
  1. /home/javalee:cat ppp
  2. cat datafile|tr "'" "\n"|sed 's/-[a-z]\{1\}\\//g'|\
  3. sed -n '/^sss/p;/^\//p;/^[ ]\{1,\}----/p'|tr '\n' ' '|sed 's/sss/\
  4. sss/g'
  5. echo
复制代码
/home/javalee:ksh ppp

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
sss /usr/bin/qqq start  ----first10
sss /lcf/bin/zzz start  ----first11
sss /usr/bin/jjj status
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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