我并不擅长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命令执行此操作?谢谢!
答案 0 :(得分:2)
有很多方法可以轻松完成。您可以使用shell(任何具有参数扩展和子字符串删除的现代shell),也可以使用sed
或awk
或其任意组合。
您还没有指定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)"