Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Unix 如何使用sed或awk剥离一组线或块?_Unix_Awk_Sed - Fatal编程技术网

Unix 如何使用sed或awk剥离一组线或块?

Unix 如何使用sed或awk剥离一组线或块?,unix,awk,sed,Unix,Awk,Sed,我在运行OSX。我可以使用什么命令行工具进行此操作?我有一个带有这个JSON输出的大文本文件。我正在寻找一种方法,只删除那些没有上次登录日期的电子邮件,我对没有最后登录日期的记录不感兴趣。以下是输出: { "_id" : ObjectId("52fba903e4b0aa6226e0ce26"), "email" : "bar@foo.com" } { "_id" : ObjectId("521ca254e4b0d28eb6a07f26"),

我在运行OSX。我可以使用什么命令行工具进行此操作?我有一个带有这个JSON输出的大文本文件。我正在寻找一种方法,只删除那些没有上次登录日期的
电子邮件,我对没有最后登录日期的记录不感兴趣。以下是输出:

{
        "_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附带的BSD
grep
,但依赖于非常特定的文件布局

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附带的BSD
grep
,但依赖于非常特定的文件布局

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。不幸的是,这是我的文件输出与…一起工作只是看看是否有办法清洁这个。谢谢。可能是重复的