如何从文件中提取单行数据以及该行中的其他进程?

问题描述 投票:0回答:1

我有包含内容的日志文件。即文件名是

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
linux bash shell unix sh
1个回答
0
投票
$ 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

© www.soinside.com 2019 - 2024. All rights reserved.