当我不使用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
如果需要更多代码来完全了解正在发生的事情,请告诉我。
感谢任何帮助。
答案 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
以字节为单位工作,因此请使用head
和wc
找出第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行日志文件,这可能有点过分。