免费注册 查看新帖 |

Chinaunix

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

继旧版的问题,问红袖添香!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-01-15 19:21 |只看该作者 |倒序浏览
红袖兄你不要嫌我太烦!
上次的内容是这样的!
#!/bin/sh

echo "+----------+----------+----------+----------+----------+"
line=1

sed 's/    / -1 /g' tbl.txt > tbl.tmp

while read i; do
test $line -gt 3 && exit
set $i
printf "| %8d | %8d | %8d | %8d | %8d |\n" $*
echo "+----------+----------+----------+----------+----------+"
line=`expr $line + 1`
done < tbl.tmp | sed 's/-1/  /g'

rm tbl.tmp

--------------------------------------------------------------------


运行结果:


bash-2.05:~/tmp$ sh tbl.sh
+----------+----------+----------+----------+----------+
|   12345 | 545454 |    8484 |   32365 |      215 |
+----------+----------+----------+----------+----------+
|       213 |     6262 |             |      322 |         32 |
+----------+----------+----------+----------+----------+
|   65256 |      626 |       362 |      326 |   36262 |
+----------+----------+----------+----------+----------+


请问:
假如我对文件tbl.txt没确定行数,那么这句应如何判断:
test $line -gt 3 &amp;&amp; exit
问题2,假如我的文件如下:
12345|545454|8484|32365|215|
213|6262| |322|32|
65256|626|362|326|36262|
该如何写呢?

论坛徽章:
0
2 [报告]
发表于 2003-01-15 21:35 |只看该作者

继旧版的问题,问红袖添香!!!

原帖由 "GM" 发表:
请问:
假如我对文件tbl.txt没确定行数,那么这句应如何判断:
test $line -gt 3 && exit


这段代码并没有预先假定是知道行数的。

原帖由 "GM" 发表:

问题2,假如我的文件如下:
12345|545454|8484|32365|215|
213|6262| |322|32|
65256|626|362|326|36262|
该如何写呢?


要完成它是很容易的,方法也很多,但是

1。举一反三粉重要ㄛ,我又要这么说了。在这里主要就是抛砖引玉,但我们老是丢砖会不会把别人都要看烦了? em03  em03  em03

2。要学会逆向思维,“假设最终代码就是这样,那怎样使源文件符合这段代码的条件?”


这样子,很难不想到,把“|”变成“ ”不就跟你原来的源文件的格式一样了吗,这段代码不就不用改动了吗?

  1.   sed 's/|/ /g' file1 > file2
复制代码

论坛徽章:
0
3 [报告]
发表于 2003-01-15 22:34 |只看该作者

继旧版的问题,问红袖添香!!!

谢谢!
我还有问题:
#!/bin/sh

while read ip ; do
   ping  -c 20 $ip &amp;
   sleep 1 &amp;&amp; echo "\033[1m*** time is over, terminate $ip ***\033[m"
   ps ax | awk -v pat=$ip '$0 ~ pat {print $1}' | xargs kill -9
done <<EOF
10.0.0.2
10.0.0.77
10.0.0.78
10.0.0.88
EOF


bash-2.05:~/tmp$ sh tping
PING 10.0.0.2 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: icmp_seq=0 ttl=255 time=0.947 ms
*** time is over, terminate 10.0.0.2 ***
64 bytes from 10.0.0.2: icmp_seq=1 ttl=255 time=2.476 ms
PING 10.0.0.77 (10.0.0.77): 56 data bytes
64 bytes from 10.0.0.77: icmp_seq=0 ttl=128 time=0.732 ms
64 bytes from 10.0.0.77: icmp_seq=1 ttl=128 time=1.139 ms
*** time is over, terminate 10.0.0.77 ***
PING 10.0.0.78 (10.0.0.7: 56 data bytes
*** time is over, terminate 10.0.0.78 ***
PING 10.0.0.88 (10.0.0.8: 56 data bytes
64 bytes from 10.0.0.88: icmp_seq=0 ttl=128 time=0.697 ms
64 bytes from 10.0.0.88: icmp_seq=1 ttl=128 time=0.500 ms
*** time is over, terminate 10.0.0.88 ***



假如,有一个用户正在telnet  10.0.0.2
在执行上面的程序时,不是也给kill了吗?
所以最好ps ax | awk -v pat=$ip '$0 ~ pat {print $1}' | xargs kill -9
加上具体的方式,pat=ping $ip,但要如何写呢,veal $ip???

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-01-16 10:17 |只看该作者

继旧版的问题,问红袖添香!!!

不会,kill 杀的是进程号,而非进程名

论坛徽章:
0
5 [报告]
发表于 2003-01-16 18:49 |只看该作者

继旧版的问题,问红袖添香!!!

GM 说的有道理,laoxia 可能没仔细看,或者已经忘记这个旧帖的来龙去脉了。

不过上次旧帖没有过多考虑其它诸方面的问题,只是想说明一下如何杀掉后台进程,是应该根据自己的要求,加上各种细节。

这里呢比如说你只想杀 ping $ip 进程,可以写成

... | awk -v pat="ping.*$ip" '$0 ~ pat {print $1}' | xargs kill -9

(根据原贴,实际上这个正则表达式还匹配比如 ping   10x0x0x2,其中 x 表示任意字符,但是这样的进程,实际并不多见也无意义(杀了就杀了吧),再细点得自己根据实际要求来写)。

论坛徽章:
0
6 [报告]
发表于 2003-01-17 13:10 |只看该作者

继旧版的问题,问红袖添香!!!

... | awk -v pat="ping.*$ip" '$0 ~ pat {print $1}' | xargs kill
我认为只要写成
... | awk -v pat="ping $ip" '$0 ~ pat {print $1}' | xargs kill
可以了,你把pat="ping.*$ip" 这样,把pat 打出来是这样的
echo $pat
ping.*10.0.0.2
这是什么意思,有何意义呢?请赐教!!!!

论坛徽章:
0
7 [报告]
发表于 2003-01-17 17:36 |只看该作者

继旧版的问题,问红袖添香!!!

...

pat 的值 ping.*10.0.0.2 拿来做正则表达式,表示

ping 和 10.0.0.2 之间还可能有其它字符,比如很多空格。

(这里没有用严格的表示空格的正则表达式,而是用了任意字符,因为那么严格在该段程序里意义不大)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP