【问题标题】:How to extract the last line from the wget command output?如何从 wget 命令输出中提取最后一行?
【发布时间】:2014-03-16 17:01:49
【问题描述】:

DRLAncillary_2014-01-25.tgz 文件在 FTP 服务器主机 is.sci.gsfc.nasa.gov 上的远程目录 CompressedArchivedAncillary 下不存在。

如果我使用带有--spider 选项的wget 命令来确定它的存在,终端窗口上会显示以下输出行并通过管道传输到输出文件/tmp/fileinfo.txt

wget --output-document=/dev/null --spider ftp://is.sci.gsfc.nasa.gov/CompressedArchivedAncillary/DRLAncillary_2014-01-25.tgz 2>&1 | tee /tmp/fileinfo.txt

==================================================================================
--2014-02-17 18:20:25--  ftp://is.sci.gsfc.nasa.gov/CompressedArchivedAncillary/DRLAncillary_2014-01-25.tgz
           => “/dev/null”
Resolving is.sci.gsfc.nasa.gov... 169.154.128.59
Connecting to is.sci.gsfc.nasa.gov|169.154.128.59|:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done.    ==> PWD ... done.
==> TYPE I ... done.  ==> CWD (1) /CompressedArchivedAncillary ... done.
==> SIZE DRLAncillary_2014-01-25.tgz ... done.
==> PASV ... done.    --2014-02-17 18:20:29--  ftp://is.sci.gsfc.nasa.gov/CompressedArchivedAncillary/DRLAncillary_2014-01-25.tgz
           => “.listing”
==> CWD (1) /CompressedArchivedAncillary ... done.
==> PASV ... done.    ==> LIST ... done.

     0K .......... .......... .......... ...                   35.6K=0.9s

Removed “.listing”.

No such file “DRLAncillary_2014-01-25.tgz”.

================================================ ====================================

DRLAncillary_2014-01-15.tgz文件确实存在于FTP服务器主机is.sci.gsfc.nasa.gov上的远程目录CompressedArchivedAncillary下。

如果我使用带有--spider 选项的 wget 命令来确定它的存在,终端窗口上会显示以下输出行并通过管道传输到输出文件/tmp/fileinfo.txt

wget --output-document=/dev/null --spider ftp://is.sci.gsfc.nasa.gov/CompressedArchivedAncillary/DRLAncillary_2014-01-15.tgz 2>&1 | tee /tmp/fileinfo.txt

==================================================================================
--2014-02-17 18:22:18--  ftp://is.sci.gsfc.nasa.gov/CompressedArchivedAncillary/DRLAncillary_2014-01-15.tgz
           => “/dev/null”
Resolving is.sci.gsfc.nasa.gov... 169.154.128.59
Connecting to is.sci.gsfc.nasa.gov|169.154.128.59|:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done.    ==> PWD ... done.
==> TYPE I ... done.  ==> CWD (1) /CompressedArchivedAncillary ... done.
==> SIZE DRLAncillary_2014-01-15.tgz ... 1811109782
==> PASV ... done.    --2014-02-17 18:22:21--  ftp://is.sci.gsfc.nasa.gov/CompressedArchivedAncillary/DRLAncillary_2014-01-15.tgz
           => “.listing”
==> CWD (1) /CompressedArchivedAncillary ... done.
==> PASV ... done.    ==> LIST ... done.

     0K .......... .......... .......... ...                   42.0K=0.8s

Removed “.listing”.

File “DRLAncillary_2014-01-15.tgz” exists.
==================================================================================

带有 --spider 选项的 wget 命令可以获取我想要的消息,并将它们存储到特定文件中。从上面列出的两段中可以看出,它们在顶部和底部都用连续的等号形成的线分隔:

当搜索文件不存在时,输出的最后一行是 File “DRLAncillary_2014-01-15.tgz” exists.

当搜索确实存在时,输出的最后一行显示为 No such file “DRLAncillary_2014-01-25.tgz”.

================================================ ====================================

所以我的问题是:

  1. 如何将 wget 输出重定向(使用管道运算符)到 一个或多个启用过滤器的命令,例如 sed、grep、xargs、awk、 tail 等以仅从流中提取最后一行 缓冲区而不首先将输出存储在固定文件中,然后 从该文件中读取最后一行?此外,我希望 提取的字符串将保存在一个变量中,我不希望 屏幕相当/清晰,而不是回显任何消息。

  2. 目前可以使用如下复合命令获取 输出文件 /tmp/fileinfo.txt 的最后一行: 尾 -2 /tmp/fileinfo.txt |头 -1

    虽然这不是我进行简单文件存在检查的理想解决方案,但如果您的 bash 脚本专家可以帮我对我的 wget 命令行进行一些修改以回显终端窗口打印,我可以凑合它。

提前谢谢你!

【问题讨论】:

  • 请更好地格式化您问题中的代码。
  • ctrl + k 在你的代码中
  • afaict | tail -2 | head -1 没有得到最后一行,而是最后一行之前的行

标签: linux bash wget


【解决方案1】:

对不起,我不知道我是否理解了这个问题..但是你试过了吗:

wget ... | awk '/^File/ {print}; /No such/ {print}';

root@stormtrooper:~# wget --output-document=/dev/null --spider ftp://is.sci.gsfc.nasa.gov/CompressedArchivedAncillary/DRLAncillary_2014-01-25.tgz 2>&1 | awk '/^File/ {print}; /^No such/{print}'
No such file ‘DRLAncillary_2014-01-25.tgz’.
root@stormtrooper:~# wget --output-document=/dev/null --spider ftp://is.sci.gsfc.nasa.gov/CompressedArchivedAncillary/DRLAncillary_2014-01-15.tgz 2>&1  | awk '/^File/ {print}; /^No such/{print}'
File ‘DRLAncillary_2014-01-15.tgz’ exists.

对不起英语不好

【讨论】:

  • 你也可以使用 egrep egrep '^(File|No such)'
  • 亲爱的 BrenoZan 先生,哈哈! “差”的英语,但很好的答案!非常感谢!
【解决方案2】:

你不能不通过文件就直接通过headtail

wget --output-document=/dev/null --spider ftp://is.sci.gsfc.nasa.gov/CompressedArchivedAncillary/DRLAncillary_2014-01-15.tgz 2>&1 | tail -2 | head -1

【讨论】:

  • @Mr. Matthew Strawbridge,您的解决方案只是打印空白。无论如何,谢谢你的回答。
【解决方案3】:

我如何将 wget 输出重定向(使用管道运算符) 到一个或多个启用过滤器的命令,例如 sed、grep、xargs、awk、tail 等到 仅从流缓冲区中提取最后一行,而不首先将输出存储在固定文件中,然后从该文件中读取最后一行?此外,我希望提取的字符串将保存在一个变量中,并且我不希望屏幕完全/清晰,而不是回显任何一条消息。

 LAST_LINE=$(wget -O- http://URL 2> /dev/null | tail -1)

【讨论】:

  • 亲爱的 zmo,您的解决方案只打印一个空白行。感谢您抽出宝贵时间回答我的问题。
  • 好吧,我从字面上回答了你的问题,但并没有试图深入了解你真正想要的东西;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多