Unix:Bash:脚本位于使用head命令之后

时间:2015-01-30 21:54:29

标签: bash unix

当我不使用head命令时,我有一个运行正常的脚本,但是当我使用它并运行脚本时,脚本就像是在等待插入命令一样。

我正在使用head来尝试将文件行限制为1000。

我试图限制的文件在下面$ {LOG}变量的路径中描述。该文件是脚本的结果,文件的名称取决于您运行脚本的目录以及找到的操作系统。

Ex:./ test ex1

文件名为ex1-Linux-X.log。

我正在使用:

head -n1000 > filename

尝试限制输出行。

以下是我的一些脚本,以显示我尝试使用它的位置。

STUID=$1
PATH=${PATH}\:.
TMPFILE=tempfile
GDIR=`pwd`
OSNAME=`uname -s`
LOG=${GDIR}/results/${STUID}-${OSNAME}-X.log
DATE=`date`



 make -s clean
rm -f ${LOG}
touch ${LOG}
head -n1000 > filename

如果需要更多代码来完全了解正在发生的事情,请告诉我。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

head命令不应该用于限制行转到文件。

这是head命令的手册。

  

HEAD(1)BSD通用命令手册
  头(1)

     

NAME        head - 显示文件的第一行

     

概要        头[-n count | -c bytes] [file ...]

     

说明        此过滤器显示每个指定文件的第一个计数行或字节,如果没有文件,则显示标准输入的        指明分数。如果省略count,则默认为10.

 If more than a single file is specified, each file is preceded by a header consisting of the string ``==> XXX <=='' where ``XXX''
 is the name of the file.
     

退出状态        head实用程序在成功时退出0,如果发生错误则退出>。

     

另见        尾(1)

     

史        head命令出现在PWB UNIX中。

     

BSD 1993年6月6日
  BSD(完)

答案 1 :(得分:1)

head -n1000 > filename说从STDIN 读取前几行并将它们输出到filename。 head会等待您在程序中输入1000行输入。

如果您只想将文件截断为前1000行,head可以执行此操作,但您必须使用临时文件。

head -n1000 ${LOG} > ${LOG}.tmp
mv ${LOG}.tmp ${LOG}

如果您一步尝试,那么shell重定向(> ${LOG})会在head读取之前截断日志文件。

对于正在使用的日志文件,这不是一个好主意,可能正在写入它并可能继续尝试写入已删除的日志文件。相反,您可以使用truncate截断第1000行的文件。truncate以字节为单位工作,因此请使用headwc找出第1000个字节线已开启。

truncate --size=`head -n1000 ${LOG} | wc -c` ${LOG}

根据您的代码,我不确定您真正想要的是什么。您的代码删除并重新创建日志文件,然后在保证为空的日志文件上调用head。你想要一个永远超过1000行的文件吗?不能这样做,不是没有弄乱命名管道或某种文件系统事件程序,你可能不想这样做。

你可能想要像FIFO queue这样的东西,因为新的日志条目被添加,旧的日志条目被抛出。文件为LIFO, like a stack,您最后会添加新的日志条目,并且您还要从最后删除它们。如果您将文件限制为1000行,那么您将丢弃新的日志行。

接下来的问题是:1000行非常小。这是一个无关紧要的磁盘空间,可能是80k?一个重大事件,即您最想要登录的事件,可以轻松吹掉超过1000行的日志记录。你可能想稍微提高一点。

相反,请使用日志旋转器。这是一个程序,它会定期将日志存档为每日,每小时,每周和每月日志文件。这样,您的日志文件仍然很小,更容易查找,您永远不会丢失日志信息,您可以定期备份和删除旧日志。这取决于您使用的系统Debian has logrotate

另一个选择是不使用自己编写日志,而是使用日志服务器,例如syslog或数据库。日志服务器可以管理日志文件的大小。对于1000行日志文件,这可能有点过分。