如何根据搜索返回分割行的全部内容?



我以前发布过一个我正在编写的小脚本。我最终解决了这个问题。现在我遇到了一个不同的问题。希望你能帮上忙。

一些设置:我有一个短列表存储为markdown文件。

|One Hundred Years of Solitude|Gabriel García Márquez|-|-|-|-|1967|
|Moby-Dick|Herman Melville|-|-|-|-|1851|
|Frankenstein|Mary Shelley|-|-|-|-|1818|
|On the Road|Jack Kerouac|-|-|-|-|1957|
|The Turn of the Screw|Henry James|-|-|-|-|-|

我已经知道如何通过cat、sed、xargs和awk提供文件。

cat list.md | sed -e 's/^|//' -e 's/|$//' -e 's/^ *//' 
-e '/^:/d' -e '/'Title'/d' -e '/^r/d' -e '/^$/d' | xargs -0 echo | 
awk -F '|' '{print "----"} {print "Title:", $1} {print "Author:", $2} 
{print "Date Begun:", $4} {print "Date Finished:", $5}'

该命令返回如下:

----
Title: One Hundred Years of Solitude
Author: Gabriel García Márquez
Date Begun: -
Date Finished: -
----
Title: Moby-Dick
Author: Herman Melville
Date Begun: -
Date Finished: -
----
Title: Frankenstein
Author: Mary Shelley
Date Begun: -
Date Finished: -
----
Title: On the Road
Author: Jack Kerouac
Date Begun: -
Date Finished: -
----
Title: The Turn of the Screw
Author: Henry James
Date Begun: -
Date Finished: -

我想做的是将其合并到一个脚本中,我可以用'books Melville'这样的参数运行,它将运行上述命令,将其管道到grep中,搜索参数(最好是一个单词或字符串),然后返回整行。例如,如果我输入'books Melville',脚本将返回

----
Title: Moby-Dick
Author: Herman Melville
Date Begun: -
Date Finished: -

目前,如果我输入'books Melville',它返回的都是'Author: Herman Melville'。

很抱歉写了这么久。

再次道歉:我忘了说我用的是OSX。

我会给你两个小的awk脚本(将需要GNU awk第二个脚本由于多字符RS。您可以通过使用空格而不是----并使用awk段落模式来使其可移植)。第一个脚本将删除所有这些混乱并创建一个数据库文件。

$ cat md.file
|One Hundred Years of Solitude|Gabriel García Márquez|-|-|-|-|1967|
|Moby-Dick|Herman Melville|-|-|-|-|1851|
|Frankenstein|Mary Shelley|-|-|-|-|1818|
|On the Road|Jack Kerouac|-|-|-|-|1957|
|The Turn of the Screw|Henry James|-|-|-|-|-|

$ awk -F"[|]" '{
    printf "----nTitle: %snAuthor: %snDate Begun: %snDate Finished: %sn", $2, $3, $5, $6
  }' md.file > database.file

现在database.file看起来像这样:

----
Title: One Hundred Years of Solitude
Author: Gabriel García Márquez
Date Begun: -
Date Finished: -
----
Title: Moby-Dick
Author: Herman Melville
Date Begun: -
Date Finished: -
----
Title: Frankenstein
Author: Mary Shelley
Date Begun: -
Date Finished: -
----
Title: On the Road
Author: Jack Kerouac
Date Begun: -
Date Finished: -
----
Title: The Turn of the Screw
Author: Henry James
Date Begun: -
Date Finished: -

一旦文件准备好了,您可以在bash脚本中或从命令行中使用以下awk脚本,以您认为合适的任何方式使用。

如果您希望从bash文件运行,您可以创建一个想要搜索的bash变量。

$ look=Melville
$ echo "$look"
Melville
$ awk -v RS="----" -vlook="$look" '$0~look' database.file
Title: Moby-Dick
Author: Herman Melville
Date Begun: -
Date Finished: -

如果您希望绕过shell变量,您可以只进行正则表达式搜索。

awk -v RS="----" '/Melville/' database.file
如果您的条件是true,则

awk将为您打印。这意味着,上面的语句就像是在说

awk -v RS="----" '/Melville/ { print $0 }' database.file

awk -v RS="----" -vlook="$look" '$0~look { print $0 }' database.file

使用bash:

seek=he
labels=(- Title Author - "Date Begun" "Date Finished")
while IFS='|' read -ra fields; do
    [[ "${fields[*]}" == *"$seek"* ]] || continue
    printf "%sn" "----"
    for i in 1 2 4 5; do
        printf "%s: %sn" "${labels[i]}" "${fields[i]}"
    done
done < list.md
----
Title: Frankenstein
Author: Mary Shelley
Date Begun: -
Date Finished: -
----
Title: On the Road
Author: Jack Kerouac
Date Begun: -
Date Finished: -
----
Title: The Turn of the Screw
Author: Henry James
Date Begun: -
Date Finished: -

Using Awk:

#!/usr/bin/awk -f
BEGIN {
    if (!(ARGC >= 2)) exit
    search = ARGV[1]
    ARGV[1] = "/complete/path/to/list.md"
    FS = "|"
    OFS = "n"
}
$0 ~ search {
    print "----", "Title: " $2, "Author: " $3, "Date Begun: " $4, "Date Finished: " $5
}

"/complete/path/to/list.md"改为实数。将其保存在$PATH覆盖的目录中,如/usr/local/bin,并将其命名为books。将其权限更改为0755,然后使用books Melv进行测试。

如果您不是以root身份运行,为了方便起见,请先将其保存到script.awk这样的临时文件中,进行一些适当的编辑,然后运行:

sudo install -m 0755 script.awk /usr/local/bin/books

多个关键词

这个版本允许多个关键字来验证搜索:

#!/usr/bin/awk -f
BEGIN {
    if (!(ARGC >= 2)) exit
    for (i = 1; i < ARGC; ++i) {
        keywords[k++] = ARGV[i]
    }
    ARGV[1] = "/complete/path/to/list.md"
    ARGC = 2
    FS = "|"
    OFS = "n"
}
$0 ~ keywords[0] {
    for (i = 1; i < k; ++i) {
        if (!($0 ~ keywords[i])) {
            next
        }
    }
    print "----", "Title: " $2, "Author: " $3, "Date Begun: " $4, "Date Finished: " $5
}

最新更新