我想打印包含单词统计信息的行以外的文件中的所有内容-
现在我想做的是-
$a=sed -n '/Stats/=' file.txt | sed -n '$a,$p' file.txt
当然,上面建议的方式不起作用,但我还能做什么?
例如,假设这个词是一个行号。40 然后我想打印从第 41 行到结尾的所有内容。
请告诉我如何将变量从管道的一侧传递到另一侧?另外,如果有人可以通过其他方式来做到这一点,那将是很大的帮助。
谢谢
对不起,这将是超级快,必须回去工作。你想要这个 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”从不匹配)。
玩得开心...
另一种awk
解决方案
awk '/Stats/ {f=1} f' file
当找到单词时Stats
,将标志设置f
为真。
如果f
为真,则执行默认操作,打印该行,与{print $0}
将变量从 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
这里我们a
在父 shell 进程中将变量设置为 100。第二条命令上管道的 LHS 和 RHS(左侧和右侧)都接收此变量的副本。LHS 打印复制变量,将其递增 1,然后再次打印。RHS 打印复制变量,将其增加 10,然后再次打印。然后父 shell 打印其原始版本的变量。我们可以看到 LHS 和 RHS 子shell 完全独立地递增它们的变量副本。然后我们还看到父代中的原始版本完全不受 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