将grep输出格式设置为CSV

时间:2016-04-07 21:47:17

标签: linux csv grep

我并不擅长Linux。我正在使用下一个命令来查找一些数据:

svn info -R https://SOME_URL/TEST | grep 'Ruta: \|Fecha de último cambio: '

我得到的输出如下:

Ruta: TEST
Fecha de último cambio: 2016-04-07 15:52:40 -0500 (jue 07 de abr de 2016)
Ruta: PRUEBA1.txt
Fecha de último cambio: 2016-04-07 15:16:19 -0500 (jue 07 de abr de 2016)
Ruta: PRUEBA2.txt
Fecha de último cambio: 2016-04-07 15:15:47 -0500 (jue 07 de abr de 2016)

但是我需要提交一份报告,所以我希望将输出视为CSV文档,例如:

"Ruta";"Fecha"
"TEST";"2016-04-07 15:52:40 -0500 (jue 07 de abr de 2016)"
"PRUEBA1.txt";"2016-04-07 15:16:19 -0500 (jue 07 de abr de 2016)"
"PRUEBA2.txt";"2016-04-07 15:15:47 -0500 (jue 07 de abr de 2016)"

是否可以仅使用linux命令执行此操作?谢谢!

3 个答案:

答案 0 :(得分:2)

有很多方法可以轻松完成。您可以使用shell(任何具有参数扩展和子字符串删除的现代shell),也可以使用sedawk或其任意组合。

您还没有指定shell,但只要您拥有符合POSIX标准的shell,短脚本就可以以相当简单的方式处理/解析svn命令的结果。以下使用bash,但参数扩展可以在任何POSIX shell中使用:

#!/bin/bash

fname="${1:-/dev/stdin}"  ## read from given filename or stdin (default)

echo "Ruta;Fecha"       ## print heading

while read -r line; do  ## for each line of input
    [ "${line%%:*}" = "Ruta" ] && echo -n "${line##* }" ## begins 'Ruta'
    [ "${line%%:*}" = "Fecha de último cambio" ] && {   ## begins "Fecha.."
        tmp="${line#*:}"
        echo ";${tmp:1}"
    }
done < "$fname"

输入文件

$ cat dat/ruta.txt
Ruta: TEST
Fecha de último cambio: 2016-04-07 15:52:40 -0500 (jue 07 de abr de 2016)
Ruta: PRUEBA1.txt
Fecha de último cambio: 2016-04-07 15:16:19 -0500 (jue 07 de abr de 2016)
Ruta: PRUEBA2.txt
Fecha de último cambio: 2016-04-07 15:15:47 -0500 (jue 07 de abr de 2016)

使用/输出

$ cat dat/ruta.txt | bash parseruta.sh
Ruta;Fecha
TEST;2016-04-07 15:52:40 -0500 (jue 07 de abr de 2016)
PRUEBA1.txt;2016-04-07 15:16:19 -0500 (jue 07 de abr de 2016)
PRUEBA2.txt;2016-04-07 15:15:47 -0500 (jue 07 de abr de 2016)

要与您的命令一起使用(使用chmod 0755 scriptname使脚本可执行后),您可以执行以下操作:

svn info -R https://SOME_URL/TEST | \
grep 'Ruta: \|Fecha de último cambio: ' | \
scriptname

(这就是上面的所有一行,最后一行是'\'

尝试一下,如果您有疑问,请告诉我。

如果您仅限于POSIX shell(或${var:start:end}形式的没有字符串索引的shell),那么有一个命令需要更改。 POSIX以不同的方式处理字符串索引,因此您需要更改:

echo ";${tmp:1}"

echo $(expr substr "$tmp" 2 $(expr length "$tmp"))

为了在删除"Fecha..."部分后索引从第2个字符开始的子字符串。

答案 1 :(得分:2)

这项工作的正确工具是awk,当你使用awk时你不需要grep:

$ cat tst.awk
NR==1 { fmt="\"%s\";\"%s\"\n"; printf fmt, "Ruta", "Fecha" }
sub(/^Ruta: /,"") { ruta=$0 }
sub(/^Fecha de último cambio: /,"") { printf fmt, ruta, $0 }

$ svn info -R https://SOME_URL/TEST | awk -f tst.awk
"Ruta";"Fecha"
"TEST";"2016-04-07 15:52:40 -0500 (jue 07 de abr de 2016)"
"PRUEBA1.txt";"2016-04-07 15:16:19 -0500 (jue 07 de abr de 2016)"
"PRUEBA2.txt";"2016-04-07 15:15:47 -0500 (jue 07 de abr de 2016)"

答案 2 :(得分:1)

另一个awk替代

$ awk -v q='"' 'NR==1{print q "Ruta" q ";" q "Fecha" q} 
             /^Ruta:/{t=q $2 q; next}
                     {sub(/[^:]+: /,"");
                      print t ";" q $0 q}' file 

"Ruta";"Fecha"
"TEST";"2016-04-07 15:52:40 -0500 (jue 07 de abr de 2016)"
"PRUEBA1.txt";"2016-04-07 15:16:19 -0500 (jue 07 de abr de 2016)"
"PRUEBA2.txt";"2016-04-07 15:15:47 -0500 (jue 07 de abr de 2016)"