将变量从linux管道的一端传递给另一端

时间:2013-10-26 01:07:33

标签: linux bash sed awk pipe

我想在超出行的文件中打印包含单词统计信息的文件 -

现在我要做的是 -

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

当然,它不能按照上面提到的方式工作,但我还应该做些什么呢?

假设这个词是一行。 40然后我想打印从第41行到结束的所有内容。

请告诉我如何将管道一侧的变量传递给其他人? 此外,如果有人可以通过其他方式去做,那将是非常有帮助的。

由于

3 个答案:

答案 0 :(得分:2)

抱歉,它会超级快,必须重新开始工作。你想要AWK这个。

awk '/Stats/,0' FILE

输出:

Stats
s
dfsdfsd


sdfsdfsdfsd

文件:

lwjeawfasdfas
sdafdsfasdfasdf

asdfasdfasdfsadf


asdfas
1122


Stats
s
dfsdfsd


sdfsdfsdfsd

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

玩得开心......

答案 1 :(得分:1)

直接将变量从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子壳完全独立地增加它们的变量副本。然后我们也看到父母的原始完全不受LHS和RHS子壳的修改影响。


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

  1. 使用“简单”工具 - headtailgrepcut
  2. 使用纯
  3. 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
    

答案 2 :(得分:1)

另一个awk解决方案

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

找到单词Stats后,将标记f设置为true 如果f为真,请执行默认操作,打印该行,与{print $0}

相同