这是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个数字而忽略其余的数字。
答案 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)
以下是使用grep
和awk
的版本(其中in.txt是带上下文的文件):
$ grep -A10 SUM in.txt | egrep "added|modified" | awk '{print $2" "$5}'
82 2137
7 1281
第一个grep将匹配SUM
之后的所有内容,第二个grep仅匹配包含added
和modified
的行(在SUM之后),awk将打印第2列和第2列。 5。
您也可以使用:tr -s ' ' | cut -d ' ' -f3,6
或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