awk,sed命令从lftp日志文件中提取文件名
我有一个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
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.