我有 2 个带有文件路径和时间戳的文件。我试图将 file1: "192.168.1.4_time-final2" 与 file2: "192.168.1.1_file-stat" 的内容进行比较,并在成功的文件路径匹配后减去相应的时间戳并在几分钟内得到结果。
cat 192.168.1.1_file-stat
Mon 19 Jul 2021 03:52:09 PM IST /etc/nginx/nginx.conf
Mon 19 Jul 2021 03:52:09 PM IST /home/fes/nginxproxy.conf
Wed 03 Mar 2021 03:33:54 PM IST /home/fes/nginx/createfile
Mon 19 Jul 2021 08:52:15 PM IST /home/fes/nginx/Templates
Wed 03 Mar 2021 03:33:54 PM IST /home/fes/nginx/Templates/testPortalSAML.default
Mon 19 Jul 2021 07:28:05 PM IST /home/fes/nginx/Templates/Default.default
Wed 03 Mar 2021 03:33:54 PM IST /home/fes/nginx/Templates/testPortal.default
Mon 19 Jul 2021 08:52:15 PM IST /home/fes/nginx/Templates/BT.default
cat 192.168.1.4_time-final2
Thu 22 Jul 2021 12:46:39 PM IST /home/fes/nginx/createfile
Thu 22 Jul 2021 12:47:24 PM IST /home/fes/nginx/Templates/testPortal.default
答案1
您可以将文件从现有格式转换为制表符分隔形式,其中第一列是 Unix 时间戳,第二列是路径名。
假设 GNU和类似或的date
shell具有进程替换和字符串(稍后使用):bash
zsh
$'...'
paste <( date -f <( cut -d ' ' -f -7 file ) +%s ) \
<( cut -d ' ' -f 8- file )
这使得 GNU 将date
原始文件的前七个空格分隔列中的时间戳转换为 Unix 时间戳。然后它将它们与路径名粘贴在一起。
第一个文件的输出:
1626690129 /etc/nginx/nginx.conf
1626690129 /home/fes/nginxproxy.conf
1614765834 /home/fes/nginx/createfile
1626708135 /home/fes/nginx/Templates
1614765834 /home/fes/nginx/Templates/testPortalSAML.default
1626703085 /home/fes/nginx/Templates/Default.default
1614765834 /home/fes/nginx/Templates/testPortal.default
1626708135 /home/fes/nginx/Templates/BT.default
对于第二个文件:
1626938199 /home/fes/nginx/createfile
1626938244 /home/fes/nginx/Templates/testPortal.default
然后,我们可以对第二列上的文件进行排序,并使用join
它来提取具有相同第二列的文件:
join -t $'\t' -1 2 -2 2 \
<( paste <( date -f <( cut -d ' ' -f -7 file1 ) +%s ) \
<( cut -d ' ' -f 8- file1 ) | sort -k 2,2 ) \
<( paste <( date -f <( cut -d ' ' -f -7 file2 ) +%s ) \
<( cut -d ' ' -f 8- file2 ) | sort -k 2,2 )
给出示例输入文件的输出:
/home/fes/nginx/Templates/testPortal.default 1614765834 1626938244
/home/fes/nginx/createfile 1614765834 1626938199
然后可以通过一个简单的awk
程序来计算时间差(以分钟为单位):
join -t $'\t' -1 2 -2 2 \
<( paste <( date -f <( cut -d ' ' -f -7 file1 ) +%s ) \
<( cut -d ' ' -f 8- file1 ) | sort -k 2,2 ) \
<( paste <( date -f <( cut -d ' ' -f -7 file2 ) +%s ) \
<( cut -d ' ' -f 8- file2 ) | sort -k 2,2 ) |
awk -F '\t' '{ print ($NF - $(NF-1))/60, $1 }'
最终输出:
202874 /home/fes/nginx/Templates/testPortal.default
202873 /home/fes/nginx/createfile