linux - 如何使用shell脚本从vsftpd日志中提取文件名?

标签 linux shell vsftpd

我正在使用 vsftpd,我想从成功上传的文件中提取文件名。 日志示例:

Tue Feb  6 11:49:25 2018 [pid 13018] [xyz] OK UPLOAD: Client "1.2.3.4", "/filename.zip", 131072000 bytes, 19607.40Kbyte/sec
Tue Feb  6 11:49:25 2018 [pid 13017] [xyz] OK UPLOAD: Client "1.2.3.4", "/filename.zip", 131072000 bytes, 24426.38Kbyte/sec
Tue Feb  6 11:49:30 2018 [pid 13018] [xyz] OK UPLOAD: Client "1.2.3.4", "/filename.zip", 131072000 bytes, 25387.19Kbyte/sec

我正在使用此代码:

#!/bin/sh

tail -F /var/log/vsftpd.log | while read line; do
  if echo "$line" | grep -q 'OK UPLOAD:'; then
    line=$(echo "$line" | tr -s " ")
    filename=$(echo "$line" | cut -d, -f2)
    echo "$filename"
  fi
done

问题是如果文件名里面有逗号,它将无法正常工作。

最佳答案

不要为此使用 bash 命令,最好将这个 gnu awk 解决方案与 FPAT 结合使用:

tail /var/log/vsftpd.log |
awk -v FPAT='\\[[^]]*\\]|"[^"]*"' '/OK UPLOAD/{gsub(/[][]/, "", $2);
gsub(/"/, "", $4); cmd=sprintf("echo php /path/to/my/script.php \"%s\" \"%s\"", $2, $4);
cmd | getline result; close(cmd); print result}'

php /path/to/my/script.php xyz /filename.zip
php /path/to/my/script.php xyz /filename.zip
php /path/to/my/script.php xyz /filename.zip

一旦您对输出感到满意,请删除 php 之前的 echo

关于linux - 如何使用shell脚本从vsftpd日志中提取文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48645159/

相关文章:

linux - Qt 5.6 使用 QLocalServer 和 QLocalSocket 传递文件描述符

python - 我怎样才能让 Python 程序使用通过模块 sys 运行的命令来杀死自己?

unix - 如何在 Unix Shell 脚本中进行并行处理?

linux - 在 ec2-linux AMI 上安装最新版本的 vsftpd

编译 vsftpd 3.0.0 失败

linux - 使用 SSL 配置 VSFTPd 以正确使用 phpseclib

linux - 启动 httpd :/usr/sbin/httpd: symbol lookup error:/usr/lib64/libaprutil-1. so.0: undefined symbol: apr_os_uuid_get

linux - 在正文中使用 & 参数测量 bash 脚本的运行时间

c++ - Linux 将连续输出作为命令行参数传递

linux - 我怎样才能超过文件长度限制?