파일에서 사용자 이름을 검색하고 사용자의 전화번호를 출력합니다.

파일에서 사용자 이름을 검색하고 사용자의 전화번호를 출력합니다.

먼저 저는 다음과 같은 파일을 만들었습니다.전화포함하다:

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세미콜론을 구분 기호로 사용하여 2개의 필드로 나눕니다. 전화번호(필드 2)는 변수에 저장됩니다 .cuttelephone$number

시험

다음 스크립트를 사용하여 스크립트가 작동하고 파일의 데이터를 사용하는지 테스트할 수 있습니다 telephone.

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

위의 명령은 파일의 내용을 읽고 telephone세미콜론으로 나눈 다음 ;필드 1(이후 이름)에서 각 값을 가져와 한 번에 하나씩 반복합니다. 그런 다음 각 이름은 cmd.bashSTDIN(일명)을 통해 스크립트에 전달됩니다. <<<$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)"명령 대체"를 사용하면 명령 출력을 통해 명령 이름을 바꿀 수 있습니다.

또는 nifty 대신 Lookbehind 어설션을 사용할 수 있습니다 \K.

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

관련 정보