Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在匹配字符之间提取单词,并在awk/sed中将它们组合成新行?_Bash_Awk_Sed - Fatal编程技术网

Bash 如何在匹配字符之间提取单词,并在awk/sed中将它们组合成新行?

Bash 如何在匹配字符之间提取单词,并在awk/sed中将它们组合成新行?,bash,awk,sed,Bash,Awk,Sed,你知道如何从这些响应中删除所有格式,并只保留用逗号分隔的“值”部分吗? 我已经实现了一些类似的功能,但是做了多次运行和单独的脚本 response: { type => 'query' timestamp => '1444304880' serial => '0000012970' address => '192.168.1.1' profile => 'common' query-id => '001'

你知道如何从这些响应中删除所有格式,并只保留用逗号分隔的“值”部分吗? 我已经实现了一些类似的功能,但是做了多次运行和单独的脚本

response:
{
    type => 'query'
    timestamp => '1444304880'
    serial => '0000012970'
    address => '192.168.1.1'
    profile => 'common'
    query-id => '001'
    flags => '(NET, CORP)'
    version => '1.0.0.3'
}
response:
{
    type => 'query'
    timestamp => '1444305643'
    serial => '0000012971'
    address => '192.168.1.2'
    profile => 'common'
    query-id => '002'
    flags => '(CORP)'
    version => '1.0.0.3'
}
理想输出:

query, 1444304880, 0000012970, 192.168.1.1, common, 001, (NET, CORP), 1.0.0.3
query, 1444305643, 0000012971, 192.168.1.2, common, 002, (CORP), 1.0.0.3
我注意到我可以有两种方法,第一种是简单地打印$3和$4列:awk'{print$3,$4}'dump.txt 这给了我:

'query'
'1444304880'
'0000012970'
'192.168.1.1'
但它也包括由{}创建的空间,我可以消除这些空间。我的另一个选择是这样做,去掉response{}部分

sed "s/\'//g" dump.txt | awk '/\{/{flag=1;next}/\}/{flag=0}flag'
但是,我必须使用以下方法列出每一行:

sed -e '/type/{N;s/\n//;}'

如果您能以更好的方式提供帮助,我们将不胜感激。

假设您的所有输入都是按照示例中的结构进行的,这应该可以:

cut -d '>' -f 2 foo.txt | grep "^ " | paste -d, - - - - - - - - | tr -d "'" | sed 's/^ //'

使用GNU grep和粘贴:

grep -Po "=> '\K.*(?=')" file | paste -d , - - - - - - - -
输出:

query,1444304880,0000012970,192.168.1.1,common,001,(NET, CORP),1.0.0.3 query,1444305643,0000012971,192.168.1.2,common,002,(CORP),1.0.0.3 查询,14443048800000012970192.168.1.1,通用,001,(净,公司),1.0.0.3 查询,14443056430000012971192.168.1.2,通用,002,(公司),1.0.0.3 awk:使用“=>”作为字段分隔符

awk -F "=>" '
    # a line with 2 fields, remove single quotes and print with a comma
    NF == 2 {gsub(/\x27/, "", $2); printf "%s,", $2}
    # end of record, overwrite the trailing command and add a newline
    $0 == "}" {printf "\b \n"}   
' file

另一种解决方案,使用
gnu awk
FPAT

awk -vFPAT="['][^\n]+[']" -vRS="{" -vOFS="," '
    NR>1{$1=$1; gsub(/\x27/,""); print}' file
你得到

query,1444304880,0000012970,192.168.1.1,common,001,(NET, CORP),1.0.0.3 query,1444305643,0000012971,192.168.1.2,common,002,(CORP),1.0.0.3 查询,14443048800000012970192.168.1.1,通用,001,(净,公司),1.0.0.3 查询,14443056430000012971192.168.1.2,通用,002,(公司),1.0.0.3
如果您想将输出用作CSV文件,删除引号可能不是一个好主意。谢谢,我注意到,在使用grep和cut之后,在转储超过1GB的数据后,有些响应包含超过8行。但是,不管最后有多少行,这都会进行调整。感谢您的回复。不过,在生成数据转储后,由于某些有效的额外行似乎是文件的一部分,每数千行左右就会发生一次,因此很多数据都发生了移动。谢谢你的快速回复。