在文件中搜索用户名并输出用户的电话号码

在文件中搜索用户名并输出用户的电话号码

首先我制作了一个名为电话包含:

Jan;032569874    
Annemie;014588529    
Hans;015253694    
Stefaan;011802367

我现在需要做的是制作一个脚本,用户输入名称,输出应如下所示,

The phone number of Jan is 032569874

我尝试了很多事情,但没有任何效果像它应该做的那样。我知道这是一个非常简单的问题,但我就是做不到。

好吧,伙计们,这些答案显然来自更高层次。这就是我得到的:

#!/bin/bash
#Solution script2

IFS=";"

echo "Whose phone number do you want to know?"
read name
read name number <$1
echo "The phone number of $name is $number."

答案1

这是脚本的粗略修改版本:

$ more cmd.bash 
#!/bin/bash

echo "Whose phone number do you want to know?"
read name
number=$(grep "$name" telephone | cut -d';' -f2)
echo ''
echo "The phone number of $name is $number."

其工作原理如下:

$ ./cmd.bash 
Whose phone number do you want to know?
Hans

The phone number of Hans is 015253694.

怎么运行的

它只是通过命令获取名称read name并将输入的内容存储在变量 中$name。然后,我们 grep 遍历该文件telephone,然后使用分号作为分隔符将cut文件中的结果行拆分为 2 个字段。telephone电话号码(字段 2)存储在变量 中$number

测试

您可以使用以下脚本来测试您的脚本是否有效,并使用文件中的数据telephone

$ while read -r i ;do 
    echo "-----"
    echo "Test \"$i\""
    ./cmd.bash <<<$i
    echo "-----"
  done < <(cut -d';' -f1 telephone)

上面的命令读入文件的内容telephone,用分号 分割它;,然后从字段 1(然后是名称)中获取每个值,并一次循环遍历它们 1。然后,每个名称都会cmd.bash通过 STDIN 传递到您的脚本,又名。<<<$i。这会模拟用户输入每个名称。

$ while read -r i ;do echo "-----"; echo "Test \"$i\""; \
    ./cmd.bash <<<$i; echo "-----"; done < <(cut -d';' -f1 telephone)
-----
Test "Jan"
Whose phone number do you want to know?

The phone number of Jan is 032569874.
-----
-----
Test "Annemie"
Whose phone number do you want to know?

The phone number of Annemie is 014588529.
-----
-----
Test "Hans"
Whose phone number do you want to know?

The phone number of Hans is 015253694.
-----
-----
Test "Stefaan"
Whose phone number do you want to know?

The phone number of Stefaan is 011802367.
-----

答案2

使用awk

#!/usr/bin/awk -f
BEGIN { FS=";" } $1 ~ name { print "The number of " name " is " $2 }
phones -v name=Jan telephone                                      
The number of Jan is 032569874

答案3

name="jan"
line="$(grep -i ^"$name" file)"
if [ -n "$line" ]; then
  number="${line#*;}"
  echo "The phone number of ${name} is ${number}"
else
  echo "There is no phone number for ${name}."
fi 

答案4

我使用grep带有通知的命令\k后向断言:

$ read name; echo "The phone number of $name is $(grep -oP "$name;\K.*" telephone)"
  Jan                                  #Input
  The phone number of Jan is 032569874 #Output

-P带(perl-regexp) 参数的 grep支持\K,用于忽略先前匹配的字符(忽略名称和分号;)。

-o, --only-matching:仅打印匹配行的匹配(非空)部分。

$(command)“命令替换”允许命令的输出替换命令名称。

或者您可以使用 Lookbehind 断言代替 nifty \K

$ read name; echo "The phone number of $name is $(grep -oP "(?<=$name;).*" telephone)"

相关内容