在shell中,只打印命令输出

时间:2015-08-11 21:12:45

标签: linux bash shell

这是cloc命令的输出片段

C/C++ Header
 same                            0              0          42812          19019
 modified                       33              0            128            434
 added                           3             63            367            207
 removed                         0            105            265            479
Perl
 same                            0              0              0              0
 modified                        0              0              0              0
 added                           2              0              0              0
 removed                         0              0              0              0
-------------------------------------------------------------------------------
SUM:
  same                            0              0          54150          81007
  modified                       82              0            252           2137
  added                           7            184            802           1281
  removed                         0            234            734           1499
-------------------------------------------------------------------------------

使用Shell命令,如何仅打印82,2137(在行中修改)和7,1281(在行中添加)?我需要在“SUM:”下只打印这4个数字而忽略其余的数字。

5 个答案:

答案 0 :(得分:3)

如果您想获得项目的两个版本之间添加/修改的文件/行的数量,您可以使用cloc的XML输出正确且稳健地执行此操作:

 cloc --xml --out=report.xml --diff  bash-4.2.tar.gz bash-4.3.tar.gz 

 xmlstarlet < report.xml sel -t \
    -m /diff_results/modified/total -v @sum_files -o ' ' -v @code -nl \
    -m /diff_results/added/total    -v @sum_files -o ' ' -v @code -nl 

xmlstarlet可以输出您想要的任何格式的数字。此特定示例使用此格式(已修改的文件/行后跟添加的文件/行):

15 11157
203 6058

处理计算机可读输出而不是人类可读输出的好处是,如果cloc将来稍微改变其输出格式,它将不会中断。

答案 1 :(得分:2)

使用awk你可以这样做:

  1           0           1
           1   223.190870109536     
           2   236.811795353886     
           3   499.836079072149     
           4  -2.84289605856125     
           5   10.1209420763388     
           6   25.7789822728439     
           7   25.7789822728439     
 0  0.39524E+01  0.15332E+00
           2           1           1
           1  -2.97259433271086     
           2   1.33290127489590     
           3   0.00000000000000     
           4  -13.3039519272810     
           5  -26.8552876791965     
           6   17.9522993970202     
           7   17.9522993970202     
 0  0.14078E+01  0.78420E-01
           2           1           1
           1   12.6408810567997     
           2  -10.0191313878416     
           3  -33.9713889917032     
           4  -22.8799882366969     
           5  -23.4375397262546     
           6   20.0671762933887     
           7   20.0671762933887     
 0  0.14243E+01  0.70976E-01

答案 2 :(得分:2)

以下是使用grepawk的版本(其中in.txt是带上下文的文件):

$ grep -A10 SUM in.txt | egrep "added|modified" | awk '{print $2" "$5}'
82 2137
7 1281

第一个grep将匹配SUM之后的所有内容,第二个grep仅匹配包含addedmodified的行(在SUM之后),awk将打印第2列和第2列。 5。

您也可以使用:tr -s ' ' | cut -d ' ' -f3,6

代替awk

Charles建议:

$ grep -A10 SUM in.txt | awk '/added|modified/ {print $2" "$5}'

以下是使用ex(不使用管道)的示例:

$ ex -s +'1,/SUM/d|v/modified\|added/d|norm dWW2dW' +%p -cq! file_or_/dev/stdin
  82           2137
  7            1281

-cq!替换为-cwq以进行就地编辑。

答案 3 :(得分:1)

将输出管道输入如下:

yourcommand |  awk '/modified/||/added/{print $2","$5}' |tail -n 2
82,2137
7,1281

答案 4 :(得分:1)

如果出于某种原因,真的想要在shell中执行此操作而不是使用awk:

#!/bin/sh
set -f # disable globbing to allow string-splitting abuse below

found_header=0
while IFS= read -r line; do
  [ "$line" = "SUM:" ] && found_header=1
  [ "$found_header" = 1  ] || continue

  set -- $line # Ugly practice; only use with set -f above

  case $1 in
    modified|added) printf '%s\n' "$2,$5" ;;
  esac
done