【问题标题】:awk, sed command to extract filename from lftp log fileawk, sed 命令从 lftp 日志文件中提取文件名
【发布时间】:2020-10-22 23:49:46
【问题描述】:

我有一个 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]+-/ /' >

transfer_formatted.log。 结果:

2020-10-22 09:28:47 sftp://sftpuser@192.168.1.75/test/scripts/tmp/george1.txt 5
2020-10-22 09:28:48 sftp://sftpuser@192.168.1.75/test/scripts/tmp/george2.txt 12
2020-10-22 09:28:49 sftp://sftpuser@192.168.1.75/test/scripts/tmp/george3.txt 27

有人可以帮我处理 sed 部分吗?

【问题讨论】:

    标签: awk sed


    【解决方案1】:

    awk 也支持替换:

    $ awk '{sub(/.*\//, "", $5); sub(/[0-9]+-/, "", $6); print $1, $2, $5, $6}' ip.txt
    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
    

    或者,假设最后两列不能包含- 字符,如输入示例所示:

    $ sed -E 's|/.*/([^ ]+) [0-9]+-([0-9]+).*|\1 \2|' ip.txt
    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
    

    【讨论】:

    • 完美。两者都按预期工作。非常感谢。
    • Sundeep,最后一个问题,有没有办法用我正在使用的 sed 脚本在每一行前面加上 OK,所以输出将显示 OK 2020-10-22 09:28:47 乔治1.txt 5
    • @GeorgeAdjei 你可以使用sed -E 's|/.*/([^ ]+) [0-9]+-([0-9]+).*|\1 \2|; s/^/OK /'sed -E 's|^([^/]+).*/([^ ]+) [0-9]+-([0-9]+).*|OK \1\2 \3|'
    • 非常感谢 Sundeep,您是 sed 大师。它工作得很好。我也在等待时通过管道将它传递给 awk: 'awk '{print "OK " $0}' 来解决它,但我喜欢你的解决方案。
    【解决方案2】:

    您能否尝试在 GNU awk 中使用所示示例进行跟踪、编写和测试。

    awk '
    {
      num=split($3,arr,"/")
      split($(NF-2),arr1,"-")
      print $1,$2,arr[num],arr1[2]
    }
    ' Input_file
    

    说明:为上述添加详细说明。

    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. 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2020-01-26
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多