与 grep 一起使用的 IF-THEN 语句在 UNIX 脚本中不起作用
IF-THEN Statement used with grep not fuctioning in UNIX Script
我最近针对另一个问题发布了相同的代码。我在这方面得到了帮助,但是在尝试执行 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"
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 <
else
echo "Error: $last_name is not in file"
fi
;;
任何对此编码的深入了解将不胜感激。
编辑:
用户输入 1
用户输入:史密斯
预期输出:
姓氏:史密斯
名字:约翰
....
实际输出:
错误:Smith 不在文件中
用户输入 2
用户输入:史密斯
预期输出:
错误:史密斯不在文件中
实际输出:
错误:史密斯不在文件中
您正在使用 grep 的 -x
选项:您的用户输入必须完全匹配整行。我假设你不想要这种行为。
使用 -i
不区分大小写
read "last_name?Enter a last name: "
matches=0
grep -Fi "$last_name" "" |
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 搜索 "last name" 是一种误导——我可以输入一个城市或年份,或者一个冒号,grep 可以找到匹配项。如果您对这一思路感兴趣,请告诉我。
要测试第一个字段的字符串相等性,awk 是一个不错的选择
read "last_name?Enter a last name: "
awk -v name="$last_name" '
tolower() == tolower(name) {
print "Last Name:",
print "First Name:",
print "City:",
print "State:",
print "Class:",
print "Semester Enrolled:",
print "Year First Enrolled:",
matches++
}
END {if (matches == 0) print "No matches for:", name }
' ""
我最近针对另一个问题发布了相同的代码。我在这方面得到了帮助,但是在尝试执行 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"
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 <
else
echo "Error: $last_name is not in file"
fi
;;
任何对此编码的深入了解将不胜感激。
编辑:
用户输入 1
用户输入:史密斯
预期输出: 姓氏:史密斯 名字:约翰 ....
实际输出:
错误:Smith 不在文件中
用户输入 2
用户输入:史密斯
预期输出:
错误:史密斯不在文件中
实际输出:
错误:史密斯不在文件中
您正在使用 grep 的 -x
选项:您的用户输入必须完全匹配整行。我假设你不想要这种行为。
使用 -i
不区分大小写
read "last_name?Enter a last name: "
matches=0
grep -Fi "$last_name" "" |
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 搜索 "last name" 是一种误导——我可以输入一个城市或年份,或者一个冒号,grep 可以找到匹配项。如果您对这一思路感兴趣,请告诉我。
要测试第一个字段的字符串相等性,awk 是一个不错的选择
read "last_name?Enter a last name: "
awk -v name="$last_name" '
tolower() == tolower(name) {
print "Last Name:",
print "First Name:",
print "City:",
print "State:",
print "Class:",
print "Semester Enrolled:",
print "Year First Enrolled:",
matches++
}
END {if (matches == 0) print "No matches for:", name }
' ""