我想在超出行的文件中打印包含单词统计信息的文件 -
现在我要做的是 -
$a=sed -n '/Stats/=' file.txt | sed -n '$a,$p' file.txt
当然,它不能按照上面提到的方式工作,但我还应该做些什么呢?
假设这个词是一行。 40然后我想打印从第41行到结束的所有内容。
请告诉我如何将管道一侧的变量传递给其他人? 此外,如果有人可以通过其他方式去做,那将是非常有帮助的。
由于
答案 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子壳的修改影响。
现在我完成了理论。以下是您实际遇到的问题的一些解决方案。也许不是那么优雅,但对于我们这些尽我们所能避免阅读sed和awk联机页面的人来说,这里有几个选择:
head
,tail
,grep
和cut
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}