awk,sed命令从lftp日志文件中提取文件名

awk,sed命令从lftp日志文件中提取文件名,awk,sed,Awk,Sed,我有一个lftp日志文件,内容如下: 2020-10-22 09:28:47 /test/scripts/tmp/george1.txt -> sftp://sftpuser@192.168.1.75/test/scripts/tmp/george1.txt 0-5 2.8 KiB/s 2020-10-22 09:28:48 /test/scripts/tmp/george2.txt -> sftp://sftpuser@192.168.1.75/test/scripts/tmp/g

我有一个lftp日志文件,内容如下:

2020-10-22 09:28:47 /test/scripts/tmp/george1.txt -> sftp://sftpuser@192.168.1.75/test/scripts/tmp/george1.txt 0-5 2.8 KiB/s
2020-10-22 09:28:48 /test/scripts/tmp/george2.txt -> sftp://sftpuser@192.168.1.75/test/scripts/tmp/george2.txt 0-12 6.3 KiB/s
2020-10-22 09:28:49 /test/scripts/tmp/george3.txt -> sftp://sftpuser@192.168.1.75/test/scripts/tmp/george3.txt 0-27 15.4 KiB/s
我想得到它,所以我只有日期、时间、文件名和字节,如下所示:

2020-10-22 09:28:47 george1.txt 5
2020-10-22 09:28:48 george2.txt 12
2020-10-22 09:28:49 george3.txt 27
我有一个awk、sed脚本,它很接近,但我不知道如何在文件名前处理垃圾:

awk '{print $1, $2, $5,$6}' transfer1.log | sed -r -e 's/ [0-9]+-/ /' >
传输格式化的.log。 结果:


有人能帮我看一下sed部分吗?

你能试一下下面的内容吗,用GNU awk中显示的样本编写和测试

说明:增加对以上内容的详细说明

awk '                             ##Starting awk program from here.
{
  num=split($3,arr,"/")           ##Splitting 3rd field into array arr with delimiter / and num will have total number of elements in arr.
  split($(NF-2),arr1,"-")         ##Splitting 3rd field from last into array arr1 with delimiter -
  print $1,$2,arr[num],arr1[2]    ##Printing 1st, 2nd field then last item in arr and 2nd item of arr1 here.
}
' Input_file                      ##Mentioning Input_file name here. 

请您尝试以下,书面和测试显示的样本在GNU awk

说明:增加对以上内容的详细说明

awk '                             ##Starting awk program from here.
{
  num=split($3,arr,"/")           ##Splitting 3rd field into array arr with delimiter / and num will have total number of elements in arr.
  split($(NF-2),arr1,"-")         ##Splitting 3rd field from last into array arr1 with delimiter -
  print $1,$2,arr[num],arr1[2]    ##Printing 1st, 2nd field then last item in arr and 2nd item of arr1 here.
}
' Input_file                      ##Mentioning Input_file name here. 
awk也支持替换:

$awk'{sub/*\/,$5;sub/[0-9]+-/,$6;print$1、$2、$5、$6}'ip.txt 2020-10-22 09:28:47乔治1.txt 5 2020-10-22 09:28:48乔治2.txt 12 2020-10-22 09:28:49乔治3.txt 27 或者,假设最后两列不能有-字符,如输入示例所示:

$sed-E的|/./[^]+[0-9]+-[0-9]+.*.|\1\2|'ip.txt 2020-10-22 09:28:47乔治1.txt 5 2020-10-22 09:28:48乔治2.txt 12 2020-10-22 09:28:49乔治3.txt 27 awk也支持替换:

$awk'{sub/*\/,$5;sub/[0-9]+-/,$6;print$1、$2、$5、$6}'ip.txt 2020-10-22 09:28:47乔治1.txt 5 2020-10-22 09:28:48乔治2.txt 12 2020-10-22 09:28:49乔治3.txt 27 或者,假设最后两列不能有-字符,如输入示例所示:

$sed-E的|/./[^]+[0-9]+-[0-9]+.*.|\1\2|'ip.txt 2020-10-22 09:28:47乔治1.txt 5 2020-10-22 09:28:48乔治2.txt 12 2020-10-22 09:28:49乔治3.txt 27
完美的两人都按预期工作。非常感谢。Sundeep,最后一个问题,有没有办法在我使用的sed脚本的每一行前面加上OK,这样输出就会显示OK 2020-10-22 09:28:47 george1.txt5@GeorgeAdjei您可以使用sed-E的|/./[^]+[0-9]+-[0-9]+.*.\1\2;s/^/OK/'或sed-E的|^[^/]+./[^]+[0-9]+-[0-9]+.| OK\1\2\3 |'非常感谢Sundeep,您是sed的大师。它工作得很好。我还在等待时通过管道将其发送到awk解决了这个问题:“awk'{print OK$0}”,但我喜欢你的解决方案。完美。两人都按预期工作。非常感谢。Sundeep,最后一个问题,有没有办法在我使用的sed脚本的每一行前面加上OK,这样输出就会显示OK 2020-10-22 09:28:47 george1.txt5@GeorgeAdjei您可以使用sed-E的|/./[^]+[0-9]+-[0-9]+.*.\1\2;s/^/OK/'或sed-E的|^[^/]+./[^]+[0-9]+-[0-9]+.| OK\1\2\3 |'非常感谢Sundeep,您是sed的大师。它工作得很好。我还在等待时通过管道将其发送到awk解决了这个问题:“awk'{print OK$0}”,但我喜欢您的解决方案。
awk '                             ##Starting awk program from here.
{
  num=split($3,arr,"/")           ##Splitting 3rd field into array arr with delimiter / and num will have total number of elements in arr.
  split($(NF-2),arr1,"-")         ##Splitting 3rd field from last into array arr1 with delimiter -
  print $1,$2,arr[num],arr1[2]    ##Printing 1st, 2nd field then last item in arr and 2nd item of arr1 here.
}
' Input_file                      ##Mentioning Input_file name here.