【问题标题】:Piping unfiltered text to an awk system command's stdin将未过滤的文本通过管道传输到 awk 系统命令的标准输入
【发布时间】:2014-06-06 03:05:47
【问题描述】:

我有一个 gawk 脚本,它在一个变量中积累了一堆 HTML,现在应该通过系统命令将它通过管道传递给 lynx。

(请随时告诉我 AWK 是一个糟糕的解决方案...while read LINE; 非常糟糕(慢),所以这是采取 2)

我在 awk 中试过这个:

    cmd = sprintf( "bash -c \'lynx -dump -force_html -stdin <<< \"%s\"\'", html )
    system ( cmd )

坏主意,虽然简单的测试用例可以工作,但原始 HTML、特殊字符问题和字符串终止问题比比皆是,并且转义内转义正变得复杂得令人难以置信。

lynx 可以很好地处理我在 stdin 上抛出的任何内容,如果不通过命令行将其从 awk 传递到 stdin,我就无法将其传输到 stdin,这似乎是一个笨拙的解决方案。


编辑(添加有关我的最终目标的详细信息)以防 awk 不是一个好方法:

我想要的是从一个大文本文件中解析出 HTML,并在 html 块之间使用分隔符。我需要将每个 HTML 块传递给 lynx 进行格式化并将其转储到一个新的大文本文件中。


示例输入(来自另一个系统的转储):

**********URL: http://some/url
<html>
<head><title>Any 'ol HTML document</title</head>
<body>
<p>With pretty much any character you can imagine at some point</p>
<p>I'm using lynx to strip off the HTML and give me a nice format</p>
</body>
</html>
**********URL: http://another/url
<html><head><title>My input file provides a few 100,000 such html documents</title></head>
<body/></html>

每个 HTML 文档都应该通过lynx -dump 提供。 Lynx 可以从文件(例如命名管道,或者文件是一个选项)或标准输入(使用 -stdin 选项)中读取 HTML。

然后我的输出是:

**********URL: http://some/url
  Any 'ol HTML document

  With pretty much any character you can imagine at some point
  I'm using lynx to strip off the HTML and give me a nice format
**********URL: http://another/url
  My input file provides a few 100,000 such html documents

【问题讨论】:

  • 是的,如果 awk 中没有解决方案,这是一个很好的答案,我会继续前进。但是 awk 很大,而且我是它的初学者,所以我很难不问就知道这一点。你知道 awk 到可以这么说吗?
  • 您能否详细说明a bunch of HTML 是什么以及您期望lynx 对它使用一些示例输入/输出做什么?另外 - 今天刚刚发现 |&amp; for gawk 协同进程 (seen here),这似乎是您可以使用的东西。
  • 来自网络上随机站点的原始 HTML 源代码。与 awk 协进程的链接看起来确实是一针见血,早上第一件事就是尝试一下。我在问题中添加了有关我的最终目标的更多详细信息。
  • @DavidParks 如果你不能提供样本输入,即使是假的,我觉得这个问题无济于事。

标签: awk gawk


【解决方案1】:

试试|&amp; in gawk.,这是我从here 发现的。这将让您将 gawk 的输出作为协同进程发送到另一个命令的标准输入。

【讨论】:

  • 我在一个优雅的 10 行 gawk 脚本中实现了使用 lynx 解析所有嵌入式 HTML 文档的目标(其中一半专门用于打开/关闭协同进程),这个提示非常有帮助!
【解决方案2】:

要添加到 n0741337 的答案,这是一个使用 gawk 协进程的示例,我在阅读他的答案后所做的,它从标准输入中获取“aline”,并将其通过管道传输到 cat 协进程,并捕获来自 cat 协进程的输出并打印它:

printf "aline" | awk '
  BEGIN{cmd="cat"} 
  {
    print $0 |& cmd; 
    close(cmd, "to"); 
    while ((cmd |& getline line) > 0) { 
      print "got", line 
    }; 
    close (cmd);
  }'

result: got aline

gawk 手册对此功能有更广泛的讨论:http://www.gnu.org/software/gawk/manual/html_node/Two_002dway-I_002fO.html#Two_002dway-I_002fO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2022-07-05
    • 2020-11-02
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多