因此,我将lsof与jq结合使用以转换为json。原始输出示例:
[
"blah",
"1234",
"yoda",
"561u",
"IPv4",
"297229000",
"0t0",
"TCP",
"15.60.74.17:1511",
"(LISTEN)"
]
]
与sed一起使用时:
sed -e "s/(//" -e "s/)//" | sed 's/.*:\([0-9]\+\).*/"\1",/g'
输出结果为:
[
"blah",
"1234",
"yoda",
"561u",
"IPv4",
"297229000",
"0t0",
"TCP",
"1511",
"LISTEN"
]
]
注意到没有为“ 1511”保留空间,不确定我缺少什么,我确定有些愚蠢,有人知道我在这里缺少什么吗?
答案 0 :(得分:0)
这是因为第二个sed命令中的第一个.*
。您可以使用以下类似的字词来表示空白:
sed -e "s/(//" -e "s/)//" | sed 's/\S*:\([0-9]\+\).*/"\1",/g'
我所做的是...我可以解释,但是如果您自己弄清楚的话,会更有趣;)
编辑:好的,我这么说:第二个sed的正则表达式与第一个非空白字符匹配(\S
表示不是空白,它与\s
相反)。因此,您的第二个sed与值之前的空格不匹配。
如果我处于您的位置,则不会将sed用于此任务。使用Python之类的工具取消JSON输入的编组,然后以这种方式使用值将是一种更加自信的方法。就是说,如果必须使用sed进行操作,我将这样重写第二个sed:
sed -e "s/(//" -e "s/)//" | sed 's/".*:\([0-9]\+\)",$/"\1",/g'
答案 1 :(得分:0)
您可以使用寄存器,但是匹配更少会更容易:
echo ' "15.60.74.17:1511",' | sed -e "s/(//" -e "s/)//" -e 's/[0-9\.]*:\([0-9]\+\).*/\1",/g'
顺便说一句,您不需要2 sed-只需一个带有两个-e。
答案 2 :(得分:0)
请尝试以下操作:
sed -e 's/(\([^)]*\))/\1/' -e 's/[[:digit:].]*:\([[:digit:]]\+\)/\1/'
(\([^)]*\))
与被括号包围的子字符串匹配,并且该子字符串在\1
中被捕获。[[:digit:].]*:\([[:digit:]]\+\)
匹配由数字和/或点组成的子字符串,后跟冒号:
,然后是另一个数字序列。数字,点和冒号的开头部分已删除。