Linux管道如何向后打印值

时间:2019-06-25 01:02:56

标签: linux awk pipe

我认为可能可以解决此问题。我想在一个Linux管道中过滤之前和之后打印行数。

#befor filtering, printing number of all lines
less /etc/passwd | awk -F: '{print $1, $3}' | wc -l 

#after filtering, printing number of filtered lines
less /etc/passwd | awk -F: '{print $1, $3}' | awk '$2 >= 47{print $0}' | wc -l

但是我无法弄清楚如何从一行代码中获得这两个值。任何建议都会很棒。谢谢!

2 个答案:

答案 0 :(得分:2)

使用awk

awk -F: '{i++} $3>=47 {j++} END {print "total="i,"\n>46="j}' /etc/passwd
total=40
>46=23

i++每行增加i,得到总数。
$3>=47 {j++}测试字段3是否大于46
print "total="i,"\n>46="j打印i和j

尽可能短:测试larger than 46,因为它等于larger than and equal to 47

awk -F: '{i++}$3>46{j++}END{print i,j}' /etc/passwd

正如Ed所指出的,NR(记录数)确实包含总记录。
所以更短:

awk -F: '$3>46{j++}END{print NR,j}' /etc/passwd

答案 1 :(得分:1)

在bash中,您可以使用tee和文件描述符“拆分”管道:

less /etc/passwd | awk -F: '{print $1, $3}' | tee >(awk '$2 >= 47{print $0}' >(wc -l) | wc -l)