Unix为Bash脚本添加grep选项

时间:2016-02-28 00:27:06

标签: bash unix grep

在我正在处理的bash脚本中,我需要在命令行添加一个grep选项,以便只读取与模式匹配的文件中的单词。提示用户输入书籍,作者,出版商和发布年份,并且列表以book1~author1~pub1~date1格式存储在文件簿中,每个集合在一个单独的行上。如果在命令行(bookinfo打印)传递“print”,则将文件“books”内容放入Book:book1(\ n)中的book_print文件中。 作者:author1等。格式。我要做的是添加一个grep选项,以便在命令行中使用-f选项指定字符串时,只有“books”文件中包含该模式的行才会放在“book_print”文件中。例如,如果命令是“bookinfo -f”author2“”,则只有包含author2的“books”中的行将被放入book_print文件中。 (bookinfo是脚本的名称)

这是我到目前为止所拥有的。我启动了-f选项代码,但不知道从哪里开始。

while getops ":f" opt;
do
    case $opt in
        f)
            grep "$OPTARG" books
            ;;
        *)
            echo "Invalid argument."
            ;;
     esac
done

编辑 - 我将while循环代码更改为以下内容:

LinearProgress

我的书籍文件包含A~B~C~D和E~F~G~H行。当我运行命令./bookinfo -f“A”时,我会看到整个书籍文件,而不仅仅是包含A的行。

2 个答案:

答案 0 :(得分:2)

好像你朝着正确的方向前进,这就是你需要的:

#!/bin/bash

while getopts "f:" opt;
do
  case $opt in
    f)
      echo "Found pattern: $OPTARG"
      ;;
    *)
      echo "Wrong arg"
      # Call the usage function here
  esac
done

您可能希望阅读此getops tutorial以进一步了解getops的工作原理。

答案 1 :(得分:1)

不是答案,而是快速重写以使您的代码更紧凑:

print() {
    # doing this in a single awk command is much more efficient
    # the default search pattern is "non-empty line"
    awk -F '~' -v pattern="${1:-.}" '
        $0 ~ pattern {
            printf "Booktitle: \t\t %s\n", $1
            printf "Author(s): \t\t %s\n", $2
            printf "Publisher: \t\t %s\n", $3
            printf "Year of Publication: \t %s\n", $4
        }
    ' books >> book_print
}

populate() {
    while true; do
        # use read -p to incorporate the prompt, 
        # and just use one variable per item
        read -p "Booktitle (blank to quit): " book
        [[ -z "$book" ]] && break
        reap -p "Author(s): " author
        read -p "Publisher: " publisher
        read -p "Year of publication: " year
        # critically important to quote the variables here:
        printf "%s~%s~%s~%s\n" "$book" "$author" "$publisher" "$year"
    done >> books
}

# magic getopts here to set the search pattern, say in $search variable,
# and a flag to indicate print versus populate

if [[ "$do_search" -eq 1 ]]; then
    print "$search"
else
    populate
done