【问题标题】:passing variables from one side of linux pipe to other将变量从linux管道的一侧传递到另一侧
【发布时间】:2013-10-26 01:07:33
【问题描述】:

我想打印文件中包含单词统计信息的行以外的所有内容 -

现在我想做的是-

$a=sed -n '/Stats/=' file.txt | sed -n '$a,$p' file.txt

当然,上面建议的方法不起作用,但我该怎么办?

例如-假设单词是行号。 40 然后我想打印从第 41 行到结尾的所有内容。

请告诉我如何将变量从管道的一侧传递到另一侧? 另外,如果有人可以通过其他方式做到这一点,那将是很大的帮助。

谢谢

【问题讨论】:

    标签: linux bash sed awk pipe


    【解决方案1】:

    抱歉,这将是超级快,必须回去工作。你需要 AWK 来处理这个。

    awk '/Stats/,0' FILE
    

    输出:

    Stats
    s
    dfsdfsd
    
    
    sdfsdfsdfsd
    

    文件:

    lwjeawfasdfas
    sdafdsfasdfasdf
    
    asdfasdfasdfsadf
    
    
    asdfas
    1122
    
    
    Stats
    s
    dfsdfsd
    
    
    sdfsdfsdfsd
    

    它匹配所有以匹配“pattern1”的行开始并一直持续到匹配“pattern2”(包括)的行。在这个单行中,“pattern1”是一个正则表达式“/Stats/”,“pattern2”只是 0(假)。所以这个单行打印从匹配“/Stats/”的行开始到文件结尾的所有行(因为 0 始终为假,而“pattern2”从不匹配)。

    玩得开心……

    【讨论】:

    • 您也可以使用 sed 以几乎相同的方式做到这一点:sed -n '/Stats/,$p'
    【解决方案2】:

    另一个awk 解决方案

    awk '/Stats/ {f=1} f' file
    

    当找到单词Stats 时,将标志f 设置为true。
    如果f 为真,则执行默认操作,打印该行,与{print $0} 相同

    【讨论】:

      【解决方案3】:

      直接将变量从 Linux 管道的一侧传递到另一侧是不可能的,因为管道两侧的命令都是在 fork()ed 子外壳中执行的。这意味着这些命令在它们自己的父 shell 进程的副本(管道的每一侧)中执行。因此,他们将收到父进程中变量的副本,但无法直接修改父进程中的原始变量。因此,管道任一侧的子shell中的变量副本将完全相互独立,除了它们应该从父级继承相同的初始值。

      为了说明这一点,我们可以运行以下命令:

      a=100
      (echo "LHS pre: $a" 1>&2; ((a++)); echo "LHS post: $a" 1>&2) | ( echo "RHS pre: $a" 1>&2 ; ((a+=10)); echo "RHS post: $a" 1>&2 )
      echo "Parent final: $a" 1>&2
      

      输出是:

      RHS pre: 100
      RHS post: 110
      LHS pre: 100
      LHS post: 101
      Parent final: 100
      

      这里我们在父shell进程中将变量a设置为100。第二条命令上管道的 LHS 和 RHS(左侧和右侧)都接收此变量的副本。 LHS 打印复制变量,将其递增 1,然后再次打印。 RHS 打印复制变量,将其增加 10,然后再次打印。然后父 shell 打印其原始版本的变量。我们可以看到 LHS 和 RHS 子shell 完全独立地递增它们的变量副本。然后我们还看到父级中的原始完全不受 LHS 和 RHS 子外壳修改的影响。


      现在我已经完成了理论。以下是您实际遇到的问题的一些解决方案。也许不是那么优雅,但对于我们这些尽我们所能避免阅读 联机帮助页的人来说,这里有几个选择:

      1. 使用“简单”工具 - headtailgrepcut
      2. 与纯

      .

      ubuntu@ubuntu:~$ cat stats.txt 
      The first line
      The 2nd line
      the line with stats in it
      another line
      another line with stats
      another line
      the last line
      ubuntu@ubuntu:~$ tail -n-$(($(grep -n stats stats.txt | head -n1 | cut -d: -f1)+1)) stats.txt 
      another line
      another line with stats
      another line
      the last line
      ubuntu@ubuntu:~$ fl=""; while read -r line; do [ "$fl" ] && echo -e $line; [[ $line =~ stats ]] && fl=1; done < stats.txt
      another line
      another line with stats
      another line
      the last line
      

      【讨论】:

        猜你喜欢
        • 2020-05-03
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-14
        • 2018-11-04
        • 2023-03-30
        • 2022-07-29
        相关资源
        最近更新 更多