如何在 Ksh 脚本中使用 grep 变量

如何在 Ksh 脚本中使用 grep 变量
#!/bin/ksh
Temp=Kerala
cs1=`grep "$Temp" State_list.txt | awk '{print $NF}'`
echo $cs1 #("Not seeing output KL":

如果我按如下方式更改代码,它就会起作用:

cs1=`grep "Kerala" State_list.txt | awk '{print $NF}'`

...但我想将它作为变量传递。

文件State_List.txt如下:

Karnataka KAR
TamilNadu TN
Kerala    KL

答案1

这个问题在评论区已经解决了。

概括:

这些文件(包括脚本文件和可能的数据文件)都是 DOS 文本文件。在 Unix 上,这意味着\r每行末尾有一个多余的(回车符)。

对于脚本来说,这意味着变量赋值

Temp=Kerala

将值赋给Kerala\r变量Temp。由于数据文件不包含该值,因此从未找到它。

使用插入的值代替变量来运行脚本是有效的,因为它在数据中的该位置不受 DOS 文本问题的影响。

应在这两个文件上安装并运行该实用程序dos2unix,以确保它们是 Unix 文本文件。也可以看看本网站的其他问题与此实用程序相关。


该脚本也可以这样写:

#!/bin/sh

Temp='Kerala'
cs1=$( awk -v pattern="$Temp" '$1 ~ pattern { print $NF }' State_list.txt )
printf '%s\n' "$cs1"

这摆脱了grepawk在其位置使用来扫描数据内文件第一列中包含(在命令行上pattern分配的变量)的任何行。$Temp使用==in place~执行精确字符串匹配,而不是正则表达式匹配。

该脚本是一个sh脚本,因为它(和原始脚本)没有使用任何特殊ksh功能。

相关内容