【问题标题】:IF-THEN Statement used with grep not fuctioning in UNIX Script与 grep 一起使用的 IF-THEN 语句在 UNIX 脚本中不起作用
【发布时间】:2015-05-07 09:20:33
【问题描述】:

我最近为另一个问题发布了相同的代码。我得到了帮助,但是在尝试实现 If-Then 语句时,它返回了错误的结果。因此,在这个主题中,我将有 2 个问题。

第一个问题: 在文件中执行搜索时,如何实现搜索,使大写或小写没有返回所需记录的依据?

第二个问题: 在我的 If-Then 语句中,无论我键入什么,它都会显示 If-Then 语句的 else 部分。例如,名称 Smith 在文件中,但无论我输入“Smith”还是“smith”都会产生与“echo "Error: $last_name is not in file"”相同的结果。

另外: 这必须用 korn shell 编程编写。

代码如下:

#Gather search parameter
            read last_name
            if grep -Fxq "$last_name" $1
            then
                while IFS=: read c1 c2 c3 c4 c5 c6 c7 rest ; do
                    case "$c1" in
                        "$last_name" )
                            echo -e "Last Name: $c1\nFirst Name: $c2\nCity: $c3\nState: $c4\nClass: $c5\nSemester Enrolled: $c6\nYear First Enrolled: $c7\n\n"
                        ;;
                    esac
                done < $1
            else
                echo "Error: $last_name is not in file"
            fi
        ;;

任何对此编码的见解将不胜感激。

编辑:

用户输入 1

用户输入:史密斯

预期输出: 姓名:史密斯 名字:约翰 ....

实际输出:

错误:史密斯不在文件中

用户输入 2

用户输入:史密斯

预期输出:

错误:史密斯不在文件中

实际输出:

错误:史密斯不在文件中

【问题讨论】:

  • 好的,将 grep -Fxq 更改为 grep -Fiq 如果我将其全部保留为小写,例如 smith,它仍然不会提取 Smith 记录。但是,现在输入“Smith”会拉出文件,而不是之前会给出错误消息。奇怪的一件事是,如果我输入“smith”,它不会显示错误消息,它只是退出 case 语句。
  • 那是因为您的 grep 搜索不区分大小写,但大小写字符串比较不区分大小写。请查看我的回答

标签: unix if-statement ksh


【解决方案1】:

您正在使用 grep 的 -x 选项:您的用户输入必须与完整的行完全匹配。我假设你不想要这种行为。

使用-i 表示不区分大小写

        read "last_name?Enter a last name: "

        matches=0
        grep -Fi "$last_name" "$1" |
        while IFS=: read c1 c2 c3 c4 c5 c6 c7 rest; do
            echo -e "Last Name: $c1\nFirst Name: $c2\nCity: $c3\nState: $c4\nClass: $c5\nSemester Enrolled: $c6\nYear First Enrolled: $c7\n\n"
            ((matches++))
        done

        if (( matches == 0 )); then
            echo "Error: $last_name is not in file"
        fi

在这种情况下,我直接循环 grep 输出,假设可能匹配多行

当然,使用 grep 搜索“姓氏”会产生误导——我可以输入城市、年份或冒号,而 grep 可以找到匹配项。如果您对这种思路感兴趣,请告诉我。

要测试第一个字段的字符串相等性,awk 将是一个不错的选择

read "last_name?Enter a last name: "

awk -v name="$last_name" '
    tolower($1) == tolower(name) {
        print "Last Name:", $1
        print "First Name:", $2
        print "City:", $3
        print "State:", $4
        print "Class:", $5
        print "Semester Enrolled:", $6
        print "Year First Enrolled:", $7
        matches++
    }
    END {if (matches == 0) print "No matches for:", name }
' "$1"

【讨论】:

  • 感谢 Glenn,效果很好。我必须按姓氏搜索,这是说明的一部分。不过,这将帮助我实现该程序的其他方面,非常感谢。
  • 其实只是遇到了一些意想不到的结果。再次,如果我搜索 smith 记录并输入“sm”、“ith”或字符串 smith 中的任何字符,它会出现 smith 记录。有没有办法让它只在它是 smith、Smith、SMITH 或任何组合时才显示,而不仅仅是某些字符。这没什么大不了的,只是当我输入“s”时,会显示一条不同的记录。
  • 这就是我在上一段中警告的内容。你真的想要第一个字段的不区分大小写的字符串相等,对吧?
  • 是的,好的,我现在明白你在最后一段中的意思了。是的,它一直给我提供只有几个字符的记录
  • 我有没有 perl、awk 或数组的明确说明。我知道这很困难。但是,我正在做一些搜索,我想我可以以某种方式使用 egrep。我还在研究它。
猜你喜欢
  • 1970-01-01
  • 2023-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 2012-03-15
相关资源
最近更新 更多