我以前发布过一个我正在编写的小脚本。我最终解决了这个问题。现在我遇到了一个不同的问题。希望你能帮上忙。
一些设置:我有一个短列表存储为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
}