我认为可能可以解决此问题。我想在一个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
但是我无法弄清楚如何从一行代码中获得这两个值。任何建议都会很棒。谢谢!
答案 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)