这是一个示例文本文件:
store: xxx
Delete: xxx
Expires: Sat, 30 Oct 02021 13:01:57 +0100
store: xxx
Delete: xxx
Expires: Sat, 30 Oct 02021 13:01:57 +0100
store: abc
store: sdf
Expires: Sat, 30 Oct 02021 13:01:57 +0100
- 我想要CSV 格式的所有三个字段 (
store
、Delete
、 )。Expires
- 如果没有
Delete
或Expires
行/字符串,则应显示为null
或以逗号分隔的空格 - 要修剪的日期字段仅
DD Mon YYYY
例如30 Oct 2001
到目前为止,在帮助下,我们得到了以下内容,但没有按预期工作。
任何帮助将非常感激。
cat list.txt | grep -E "Expires|Delete|Store" | awk '{ printf "%s\n", $2 }' | tr '\n' ',' | sed 's/,,/\n/' | sed '$ s/.$//'
答案1
我不明白你的尝试(为什么X-Delete-At
,为什么Object:
,你想如何处理丢失的字段?),所以我建议一个sed
唯一的解决方案:
sed -nE '/Expires:/{s/: [^,]*,/:/;s/0([0-9]{4})/\1_/}
/store/!{H;$!d;}
x;s/.*store: ([[:alnum:]]*)[^>]*[> ]*(Delete: ([[:alnum:]]*)[^>]*[> ]*)*(Expires: ([^_]*))*.*/\1,\3,\5/p
$!d
x;s/.*store: ([[:alnum:]]*).*/\1,,/p' /tmp/list.txt
这个想法是收集保留空间中的字段直到下一store:
行,然后x
更改缓冲区,因此下一store:
行已经在缓冲区中,并且可以格式化收集的字段以进行输出。
诀窍在于复杂的正则表达式。可选字段放在 里面()*
,因此它们可以出现任意多次。如果它们根本不出现,整个正则表达式仍然匹配。
为了吃掉垃圾而不吃掉可选字段,我确实选择了[^>]*
而不是.*
使用以 开头的行>
。
第一行用于重新格式化日期。最后两行处理文件以store:
行结尾的情况。