LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2984|回复: 13

如何不用Shell的循环命令重复执行同一个命令N次?

[复制链接]
发表于 2005-8-17 01:25:01 | 显示全部楼层 |阅读模式
如何直接使用命令模式而不写Shell脚本执行同一个命令N次?

如何去掉一个文件最后三行进行显示?(要求:不知道总行数)
发表于 2005-8-17 05:47:08 | 显示全部楼层
Post by Safirst
如何直接使用命令模式而不写Shell脚本执行同一个命令N次?

如何去掉一个文件最后三行进行显示?(要求:不知道总行数)

1. 可以用递归法。写个小脚本也不防事。
2.
  1. awk -v v=$(cat file|awk 'END{print NR}') '{if(NR<=('$v'-3))print}' file
复制代码

方法之一。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-17 05:54:54 | 显示全部楼层
第一个方法能将代码具体写出来吗?

第二个方法还是变相地得到了文件的总行数的---awk 'END{print NR}'
我希望能像tail -n 3 file 这样不知道总行数的办法,或者能求个集合减法。。。
回复 支持 反对

使用道具 举报

发表于 2005-8-17 09:54:50 | 显示全部楼层
Post by Safirst
第一个方法能将代码具体写出来吗?

第二个方法还是变相地得到了文件的总行数的---awk 'END{print NR}'
我希望能像tail -n 3 file 这样不知道总行数的办法,或者能求个集合减法。。。


第一个其实很简单,比如:

  1. #!/bin/bash
  2. a=0
  3. loop (){
  4.        if [[ $a -lt 10 ]]; then
  5.               echo $a
  6.               ((a=$a+1))
  7.               loop
  8.        fi
  9. }

  10. loop
复制代码

第二个嘛,要想想。
回复 支持 反对

使用道具 举报

发表于 2005-8-17 10:09:37 | 显示全部楼层
第二怎么可能办到?
逻辑上我觉得就不能办到,你要显示除最后三行的内容,那必然遍历了这些内容,也就是说肯定会知道这些内容有多少行,然后再加上最后三行,也是变相地知道了总行数。
回复 支持 反对

使用道具 举报

发表于 2005-8-17 10:12:17 | 显示全部楼层
Post by Safirst
第二个方法还是变相地得到了文件的总行数的---awk 'END{print NR}'
我希望能像tail -n 3 file 这样不知道总行数的办法,或者能求个集合减法。。。


似乎 tail 也是用类似计算总行数的方法完成的吧,有些东西确实是不能省略的。这就好像面对一个无序的数组,要想查出其中某一个数据的位置,除了一个一个的比较以外,没有其他的方法。
回复 支持 反对

使用道具 举报

发表于 2005-8-17 10:17:41 | 显示全部楼层
你知道$0吗?
回复 支持 反对

使用道具 举报

发表于 2005-8-17 10:18:09 | 显示全部楼层
是的,同意krion兄和herberteuler兄意见。我想tail的源码实现中也必是将文件行数计算出来后得出的最后xx行。不然,“最后”从何说起呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-17 18:06:56 | 显示全部楼层
哦,那么我们就借助于tail已经求过了的结果完成任务行吗?
有谁知道$代表最后一行,如何才能用 $-3 表示倒数第三行行号?
$这个符号是不是可以运算的?
我想直接得到倒数第三行的行号,即使是借助于tail命令它已经帮我们求得总行数。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-17 18:08:17 | 显示全部楼层
Post by genv
你知道$0吗?


$0在这里表示什么?文件吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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