Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 如何在逐行连续读取文件的同时从apache服务器的error.log文件中分割文件?_File_Apache2_Sed_Split_Logfile - Fatal编程技术网

File 如何在逐行连续读取文件的同时从apache服务器的error.log文件中分割文件?

File 如何在逐行连续读取文件的同时从apache服务器的error.log文件中分割文件?,file,apache2,sed,split,logfile,File,Apache2,Sed,Split,Logfile,我已经这样做了,但是我在写shell脚本时遇到了麻烦。我对tail命令的功能感到困惑,而且当我在终端上看到error.log的输出时,它会显示从单词中删除了带有“e”的行 我是这样写的,请指导我如何解决我的问题。我想逐行读取这个error.log文件,在读取行的过程中,我想将固定数量的行拆分为带有后缀的小文件,即log aa,log ab,。。。我是用split命令完成的。在分割之后,我想使用正则表达式过滤包含GET或POST-word的行,并将过滤后的行存储到新文件中。完成此存储后,我需要删除

我已经这样做了,但是我在写shell脚本时遇到了麻烦。我对tail命令的功能感到困惑,而且当我在终端上看到error.log的输出时,它会显示从单词中删除了带有“e”的行

我是这样写的,请指导我如何解决我的问题。我想逐行读取这个error.log文件,在读取行的过程中,我想将固定数量的行拆分为带有后缀的小文件,即log aa,log ab,。。。我是用split命令完成的。在分割之后,我想使用正则表达式过滤包含GET或POST-word的行,并将过滤后的行存储到新文件中。完成此存储后,我需要删除所有这些日志文件

我是这样写的:

enter code here
processLine(){
  line="$@"
  echo $line
  $ tail -f $FILE
}
FILE="/var/log/apache2/error.log"
if [ "$1" == "/var/log/apache2/error.log" ]; then
   FILE="/dev/stdin"
else
   FILE="$1"
   if [ ! -f $FILE ]; then
   echo "$FILE : does not exists"
   exit 1
   elif [ ! -r $FILE ]; then
   echo "$FILE: can not read"
   exit 2
   fi
fi
#BAKIFS=$IFS
#IFS=$(echo -en "\n\b")
exec 3<&0
exec 0<"$FILE"
#sed -e 's/\[debug\].*\(data\-HEAP\)\:\/-->/g' error.log > /var/log/apache2/error.log.1
while read -r line
do
 processLine $line
done
exec 0<&3
IFS=$BAKIFS
logfile="/var/log/apache2/error.log"
pattern="bytes"
# read each new line as it gets written
# to the log file
#tail -1 $logfile 
tail -fn0 $logfile | while read line ; do
# check each line against our pattern
echo "$line" | grep -i "$pattern" 
#sed -e 's/\[debug\].*\(data\-HEAP\)\:/-->/g' error.log >/var/log/apache2/error.log
split -l 1000 error.log log-  
FILE2="/var/log/apache2/log-*"
if [ "$1" == "/var/log/apache2/log-*" ]; then
   FILE2="/dev/stdin"
else
   FILE2="$1"
   if [ ! -f $FILE2 ]; then
   echo "$FILE : does not exists"
   exit 1
   elif [ ! -r $FILE2 ]; then
   echo "$FILE: can not read"
   exit 2
   fi
fi
BAKIFS=$IFS
IFS=$(echo -en "\n\b")
exec 3<&0
exec 0<"$FILE2"
while read -r line
do
 processLine $line
 echo $line >>/var/log/apache2/url.txt
done
exec 0<&3
IFS=$BAKIFS
find . -name "var/log/apache2/logs/log-*.*" -delete
done
exit 0
在此处输入代码
processLine(){
行=“$@”
回音$线
$tail-f$文件
}
FILE=“/var/log/apache2/error.log”
如果[“$1”==”/var/log/apache2/error.log”];然后
FILE=“/dev/stdin”
其他的
FILE=“$1”
如果[!-f$文件];然后
echo“$FILE:不存在”
出口1
elif[!-r$文件];然后
echo“$文件:无法读取”
出口2
fi
fi
#BAKIFS=$IFS
#IFS=$(echo-en“\n\b”)
exec 3/var/log/apache2/error.log.1
而read-r行
做
processLine$行
完成
exec 0/var/log/apache2/error.log
拆分-l 1000 error.log日志-
FILE2=“/var/log/apache2/log-*”
如果[“$1”==”/var/log/apache2/log-*”];然后
FILE2=“/dev/stdin”
其他的
FILE2=“$1”
如果[!-f$FILE2];然后
echo“$FILE:不存在”
出口1
elif[!-r$FILE2];然后
echo“$文件:无法读取”
出口2
fi
fi
BAKIFS=$IFS
IFS=$(echo-en“\n\b”)
exec 3/var/log/apache2/url.txt
完成

exec 0您的代码似乎太长太复杂,逻辑也不清楚。如果不正常工作,就不应该让它发展到这么大

考虑这一点:

split -l 1000 error.log log-
cat log-?? | grep "GET\|POST" > storefile
rm log-??

用这个做实验。如果这三个命令达到了预期效果,您可以添加更多功能(例如,使用路径,检查是否存在
错误.log
),但在该部件正常工作之前不要添加代码。

请将代码格式化为代码。看到你输入文本的空框上方的小图标了吗?您好,非常感谢,但是我仍然没有从粘贴在这里的代码中删除什么,因为当我使用三个命令时,在将过滤后的输出存储到新文件后,无法立即删除文件file@Akash潘查:它不起作用了?给我们更多的信息。它不会删除这些文件吗?它是否删除了一些但不是全部?它是否删除了错误的文件?它是否删除了正确的文件,但还不够快?它在某种程度上起作用它将数据从日志-*文件存储到新文件,但在存储数据后,它无法删除日志-*文件,而且我还想从新文件的每一行中删除一个特定的字符串,因此我尝试这样做,但它无法手动运行try
rm log-*
,然后查看是否行得通,然后从那里开始。现在还不用担心删除字符串--在这段代码生效之前不要添加任何内容。嗨,我这样写的,它会创建分割文件并删除它们,但无法将过滤后的输出添加到新文件:
split -l 1000 error.log log-
cat log-?? | grep "GET\|POST" > storefile
rm log-??