我有包含内容的日志文件。即文件名是
convert.20231010.log
。
文件内内容如下
2024-05-17 00:14:02.447 Success ABCXYZ15 on hard disk
2024-05-17 00:14:02.447 Fail at /home/category1/sub1/ABCXYZ01 00054 is not found
2024-05-17 00:14:02.447 Success ABCXYZ16 00030 on hard disk
2024-05-17 00:14:02.447 Fail at /home/category1/sub2/ABCXYZ02 is not found
2024-05-17 00:14:02.447 Success ABCXYZ17 000110 on hard disk
我想检查文件并做一些工作。
a) 在日志中查找条件为“失败”和“未找到”的行,获取路径和文件名。
grep -E 'Fail.*is not found' convert.20231010.log
找到 2 条条件正确的线路
2024-05-17 00:14:02.447 Fail at /home/category1/sub1/ABCXYZ01 00054 is not found
2024-05-17 00:14:02.447 Fail at /home/category1/sub2/ABCXYZ02 is not found
b) 从路径中拾取文件并检查文件内容
路径和文件名将从基于步骤a创建的类别2中获取
/home/category2/sub1/ABCXYZ01 00054
/home/category2/sub2/ABCXYZ02
c) 如果内容良好则移动文件
根据步骤b,读取内容文件“ABCXYZ01 00054”和“ABCXYZ02”。如果内容良好,请将文件移至类别 3。检查文件里面的内容是“CARD”,如果确实有价值,那么文件就是好的。如果“CARD”为空或为空,请勿移动该文件。
ID=ABCXYZ01 00054
NAME=JOIN
DEPT=ACC
CARD=1234
LOC=NY
ID=ABCXYZ02
NAME=CINDY
DEPT=LOG
CARD=6789
LOC=LA
mv -f '/home/category2/sub1/ABCXYZ01 00054' '/home/category3/sub1/'
mv -f '/home/category2/sub2/ABCXYZ02' '/home/category3/sub2/'
d) 删除日志文件中的行
这将在步骤 a 中删除日志文件中的 2 行
sed -i '/Fail.*is not found/d' convert.20231010.log
我如何在 Linux 中使用 bash shell 并从步骤 a 到 d 写入新日志?我对 shell 不熟悉,感谢您的帮助。
#!/bin/bash
MYSELF=$0
MYNAME=`echo $0 | gawk '{print substr($0, match($0, /[^\/]+$/))}'`
MYNAME_NOEXT=`echo "$MYNAME" | gawk '{print gensub(/\.[^\.]*$/, "", "g")}'`
MYPATH=`echo $0 | gawk '{print substr($0, 1, match($0, /[^\/]+$/) - 1)}'`
if [ $MYPATH == "./" ]; then MYPATH="`pwd`/"; fi
cd $MYPATH
logfile="/home/category4/logs/"$MYNAME_NOEXT.`date +"%Y%m%d"`.log
(
if [ `ps -ef | grep -i "$MYNAME" | wc -l` -gt 4 ]
then
echo $(date +%Y-%m-%d) $(date +%H:%M:%S)" - Script '$MYNAME' is running. Force exit as re-entry not allowed."
exit
fi
filename="convert".`date +"%Y%m%d"`.log
while read -r line; do
linetext="$line"
echo "single line in log - $linetext"
done
echo $(date) " - Script '$MYNAME' is ended normally."
) >> $logfile 2>&1
$ cat tst.sh
#!/usr/bin/env bash
regexp='Fail at (.*) is not found'
while IFS= read -r line; do
if [[ $line =~ $regexp ]]; then
echo rm -- "${BASH_REMATCH[1]}"
else
printf '%s\n' "$line"
fi
done < "${@:--}"
$ ./tst.sh file
2024-05-17 00:14:02.447 Success ABCXYZ15 on hard disk
rm -- /home/category1/sub1/ABCXYZ01 00054
2024-05-17 00:14:02.447 Success ABCXYZ16 00030 on hard disk
rm -- /home/category1/sub2/ABCXYZ02
2024-05-17 00:14:02.447 Success ABCXYZ17 000110 on hard disk
完成测试并确保脚本执行您想要的操作后,删除
echo
。