Unix 如何使用sed或awk剥离一组线或块?
我在运行OSX。我可以使用什么命令行工具进行此操作?我有一个带有这个JSON输出的大文本文件。我正在寻找一种方法,只删除那些没有上次登录日期的Unix 如何使用sed或awk剥离一组线或块?,unix,awk,sed,Unix,Awk,Sed,我在运行OSX。我可以使用什么命令行工具进行此操作?我有一个带有这个JSON输出的大文本文件。我正在寻找一种方法,只删除那些没有上次登录日期的电子邮件,我对没有最后登录日期的记录不感兴趣。以下是输出: { "_id" : ObjectId("52fba903e4b0aa6226e0ce26"), "email" : "bar@foo.com" } { "_id" : ObjectId("521ca254e4b0d28eb6a07f26"),
电子邮件,我对没有最后登录日期的记录不感兴趣。以下是输出:
{
"_id" : ObjectId("52fba903e4b0aa6226e0ce26"),
"email" : "bar@foo.com"
}
{
"_id" : ObjectId("521ca254e4b0d28eb6a07f26"),
"email" : "foo@bar.com",
"last_login_date" : ISODate("2017-04-10T14:27:03.212Z")
}
sed或awk是这方面的候选人吗?如果是这样,你能告诉我如何从文件中删除:
{
"_id" : ObjectId("52fba903e4b0aa6226e0ce26"),
"email" : "bar@foo.com"
}
如果记录正是您描述它们的方式,那么您可以使用:
grep last_login_date -B 3 -A 1 yourFile.json > out.json
基本上是对您感兴趣的内容进行grepping,并在模式前保留3行,在模式后保留1行。如果记录与您描述它们的方式完全一致,那么您可以使用:
grep last_login_date -B 3 -A 1 yourFile.json > out.json
基本上,对您感兴趣的内容进行grepping,并在模式前保留3行,在模式后保留1行。如果输入是正确的JSON,使用第三方CLI将是正确的工具-请参见底部。
如果不是,则必须使用常规文本处理实用程序
使用macOS附带的BSDgrep
,但依赖于非常特定的文件布局
awk
提供了一种更灵活的解决方案(但仍假定输入中的JSON对象不是嵌套的):
-v RS='{'
将输入记录分隔符RS
设置为{
,这意味着一次读取一个完整的类似JSON的对象(没有前导的{
)
- 正则表达式匹配模式
/“last\u login\u date”/
在每个记录中查找子字符串“last\u login\u date”
,并仅在找到时执行相关操作({…}
)
print“{”$0}
只需打印重新添加了前导{
的匹配记录
如果输入是正确的JSON,则使用将使处理更加健壮和简洁:
jq 'select(.last_login_date)' file
上面只选择(过滤)输入文件中具有上次登录日期
属性(其值不是布尔值false
)的JSON对象。如果输入是正确的JSON,使用第三方CLI将是正确的工具-见下。
如果不是,则必须使用常规文本处理实用程序
使用macOS附带的BSDgrep
,但依赖于非常特定的文件布局
awk
提供了一种更灵活的解决方案(但仍假定输入中的JSON对象不是嵌套的):
-v RS='{'
将输入记录分隔符RS
设置为{
,这意味着一次读取一个完整的类似JSON的对象(没有前导的{
)
- 正则表达式匹配模式
/“last\u login\u date”/
在每个记录中查找子字符串“last\u login\u date”
,并仅在找到时执行相关操作({…}
)
print“{”$0}
只需打印重新添加了前导{
的匹配记录
如果输入是正确的JSON,则使用将使处理更加健壮和简洁:
jq 'select(.last_login_date)' file
上面只选择(过滤)输入文件中具有last\u login\u date
属性(其值不是布尔值false
)的JSON对象.是解析JSON的优秀CLI,但请注意,您的示例输入不是有效的JSON。不幸的是,这是我必须处理的文件输出。只是看看是否有办法清除此问题。谢谢。的可能副本是解析JSON的优秀CLI,但请注意,您的示例输入不是有效的JSON。不幸的是,这是我的文件输出与…一起工作只是看看是否有办法清洁这个。谢谢。可能是重复的