我想编写一个 shell 脚本,在其中我可以从多个文件中剪切特定的子字符串并将其写入文本文件



这些是文本文件:

f1.txt

TXT123456798
TRB0987906554
TXTxzcxczxzcxzc

f2.txt

TXT999999999
TAB888888888
TXT777777777  

Grep TXT 从多个文件中,并逐个写入每个带有文件名的剪切子字符串。

我已经尝试了以下代码:

#!/bin/sh

reports_count=`find /home/pverm84/folder1 -cmin -360 | grep txt | wc -l`
reports=($(find /home/pverm84/folder1 -cmin -360 | grep txt))

seq=0
while [ $seq -lt $reports_count ]
do
echo
CAP_reportName=${reports[$seq]}
echo File Name is $CAP_reportName
tbt= grep TXT $CAP_reportName | cut -c 4-6
File1=$(basename $CAP_reportName)
count=$tbt$File1
echo $count
seq=`expr $seq + 1`   
done

电流输出:

File name is /home/pverm84/folder1/f2.txt  
999  
777  
f2.txt  
File name is /home/pverm84/folder1/f1.txt  
123  
xzc  
f1.txt  

例外输出:

newfile.txt  
f1.txt 123   
f1.txt xzc  
f2.txt 999   
f2.txt 777

带有-H标志的grep会输出您想要的信息,只是格式不正确:

$ grep -H TXT /home/pverm84/folder1/*
/home/pverm84/folder1/file1.txt:TXT123456798
/home/pverm84/folder1/file1.txt:TXTxzcxczxzcxzc
/home/pverm84/folder1/file2.txt:TXT999999999
/home/pverm84/folder1/file2.txt:TXT777777777

我们可以使用sed来重新格式化这些行:

$ grep -H TXT /home/pverm84/folder1/* | sed -E 's/:TXT(.{3}).*/ 1/'
/home/pverm84/folder1/file1.txt 123
/home/pverm84/folder1/file1.txt xzc
/home/pverm84/folder1/file2.txt 999
/home/pverm84/folder1/file2.txt 777

sed命令匹配grep输出中的:TXTXXX...,并将其替换为XXX

您可以从目标目录运行命令以避免绝对路径:

$ cd /home/pverm84/folder1/; grep -H TXT * | sed -E 's/:TXT(.{3}).*/ 1/'
file1.txt 123
file1.txt xzc
file2.txt 999
file2.txt 777

你可以在这里尝试。

最新更新