grep을 사용하여 스크립트에서 여러 연속 단어를 얻는 방법

grep을 사용하여 스크립트에서 여러 연속 단어를 얻는 방법

저는 스크립팅을 처음 접했고 Linux 터미널 과정을 수강하고 있습니다. 우리는 Linux 배포판 Ubuntu를 사용하고 있습니다. 이번 주 과제의 일부로 열이 있는 작업표 텍스트 파일에서 특정 시간에 특정 부서에서 근무한 직원을 식별 grep해야 합니다.awk

이를 어렵게 만드는 성가신 부분은 시간이 시간과 분리되어 있어서 AM/PM시간을 쉽게 파악하는 것이 불가능하다는 것입니다. 시간을 배치하면 05:00:00작업자 AM와 행이 모두 표시되기 때문입니다.PM

해결책을 찾았습니다. 다음을 입력하세요.

grep -i  ‘05:00:00 AM’ file.txt

이것은 나에게 효과적이었고 나에게 필요한 줄을 제공했습니다.

05:00:00 AM그런데 문제는 필요에 따라 시간을 변경할 수 있도록 스크립트에서 사용해야 하고 매개변수/변수를 사용해야 한다는 것입니다 . 그런데 ‘$1’스크립트를 넣으려고 하면

grep -i '$1' 0310_Dealer_schedule | awk -F " " '{print $5} {print $6}'

빨간색으로 강조 표시되었다가 노란색으로 강조 표시로 변경됩니다.

그런 다음 를 실행하려고 하면 grep이 이를 내가 찾고 있는 디렉터리나 파일 05:00:00 AM로 처리합니다 .AM

$1다음으로 스크립트에 따옴표를 사용하지 않으려 고 했습니다 . 그런 다음 스크립트를 실행하러 갔을 때 다음을 실행했습니다.

sh scriptname.sh ‘05:00:00 AM’ 

이것은 또한 나에게 오류를 주었다“AM directory does not exist”

따라서 성공적인 실행 방법이 있는지 알고 싶습니다.

grep -i ‘05:00:00 AM’ file.txt | awk
-F “ “ ‘{print $5} {print $6}’

그러나 where 는 05:00:00 AM이를 변수로 만들고 시간 및 AM또는 을 변경할 수 있습니다 PM.

왜 따옴표나 아포스트로피가 있는 항목이 노란색으로 변하는지 모르겠습니다.

내 스크립트의 목표는 변수를 입력할 때 근무 중인 관리자의 이름을 생성하는 것입니다. 내가 말했듯이, 나를 괴롭히는 유일한 것은 sum 을 포함하는 모든 줄을 05:00:00 AM인쇄하지 않고 grep을 시도하는 것입니다 . 계속해서 줄을 인쇄 하고 싶습니다 .05:00:00AM05:00:00 AM

다음은 제가 찾고 있는 문서의 예입니다. 결과가 맞기를 바랍니다.

TIME    AM/PM   TELLERS     MANAGER
05:00:00 AM     J. Doe     C. Jones
06:00:00 AM     J. Doe     C. Jones
07:00:00 AM     J. Doe     C. Jones
08:00:00 AM     J. Doe     C. Jones
09:00:00 AM     J. Doe     C. Jones
10:00:00 AM     J. Doe     C. Jones
11:00:00 AM     J. Doe     C. Jones
12:00:00 PM     A. Smith   D. MILLER
01:00:00 PM     A. Smith   D. MILLER
02:00:00 PM     A. Smith   D. MILLER
03:00:00 PM     A. Smith   D. MILLER
04:00:00 PM     A. Smith   D. MILLER
05:00:00 PM     A. Smith   D. MILLER

도움을 주셔서 감사합니다.

편집: 미리 볼 때 문서가 여러 열로 나누어지지 않을 수 있습니다. 하지만 문서에서는 열로 구분되어 있습니다.

TIME AM/PM TELLERS MANGER

답변1

"예를 들어 변수 주위에 큰따옴표를 추가하면 "$1"쉘이 변수를 확장할 수 있지만 grep은 여전히 ​​변수를 단일 인수로 해석합니다.

답변2

확장 정규식(ERE)을 사용하여 간단하게 유지하세요.

스크립트에서 첫 번째 인수( $1)로 시간을 입력하고 두 번째 인수( $2)로 AM 또는 PM을 입력합니다. 따라서 grep다음과 같이 명령어를 작성할 수 있습니다 .

grep -i -E "$1[[:blank:]]+$2"  infile
  • "infile"에는 처리하려는 내용이 포함되어 있습니다.
  • -E확장된 정규식 플래그입니다.
  • [[:blank:]]공백이나 탭을 나타냅니다.
  • +이는 ERE 이전에 나타나는 항목이 한 번 이상 나타나야 함을 의미합니다.

그러나 위의 내용은 전체 줄을 인쇄합니다. 관리자의 이름만 출력하려면 awknot grep및 다음을 사용하세요 awk.

awk -v time=$1 -v suffix=$2 'BEGIN {pattern_ere=time"[[:blank:]]+"suffix} $0 ~ pattern_ere {print  $5, $6}' infile

... awkFS=OFS=" "의 기본값이 변경되지 않고 유지된다고 가정합니다.

답변3

아래 스크립트를 사용해보십시오. 훌륭하게 작동합니다.

#!/bin/bash
m=$1
q=$2
awk -v m="$m" -v q="$q" '$1 == m && $2 == q {print $5,$6}' file

산출

 sh script.sh  05:00:00 AM
C. Jones

할당량이 있어요

변수 m의 첫 번째 위치 인수 변수 q의 두 번째 위치 인수

마지막 단계에서는 이 변수를 사용하고 파일의 열 1과 열 2를 비교합니다.

답변4

첫째, 고려해야 할 몇 가지 요소가 있습니다( 이 예제에서는 간단히 쉘 스크립트를 호출하고 대신 myscript단순히 실행하도록 설정된 것으로 가정하겠습니다 ).myscriptsh myscript

먼저, 사용자가 명령을 실행하는 방법을 고려하십시오. 사용자가 myscript "05:00:00 AM", 또는 myscript 05:00:00 AM, 또는 myscript 5:00 AM심지어 ? 즉, 큰따옴표를 사용하여 명령줄에 전체 내용을 하나의 인수로 처리하도록 지시합니까, 아니면 따옴표를 생략하고 두 개의 인수로 처리합니까? 항상 두 자리 숫자를 사용하고 필요에 따라 앞에 0을 추가합니까? 항상 시간, 분, 초를 제공합니까(AM/PM을 지정하지 않으면 어떻게 되나요?)

모든 문제에는 해결책이 있지만 단순화를 위해 항상 를 입력해야 한다고 주장하겠습니다. myscript "hh:mm:ss xx"여기서 hh, mm 및 ss는 항상 두 자리입니다(유효한 시간도 포함되므로 42'hh'에는 유효하지 않음). 'xx'는 'am' 또는 'pm'입니다. 또한 "AM/PM"은 대문자, 소문자일 수 있으며 맥주를 너무 많이 마시고 "aM"을 입력했을 수도 있습니다...) 숫자에는 "대소문자"가 없으므로 대소문자 문제를 관련이 없도록 하겠습니다. 그리고 다른 모든 작업은 단순히 grep/awk/etc에 대소문자 구분 모드로 실행하도록 지시하여 수행할 수 있습니다(이미 수행한 것처럼 -i 플래그 사용).

위의 전제조건을 사용하여 주어진 행은 다음 grep -i '$1' 0310_Dealer_schedule | awk -F " " '{print $5} {print $6}'과 같습니다.거의옳은. (추가 편집: 여기서 "올바른"이란 귀하가 제공한 것과 정확히 같은 의미입니다. 동일한 것을 보다 효율적으로 인코딩하는 다른 방법이 있습니다.)생각하다grep -i "$1" 0310_Dealer_schedule | awk -F " " '{print $5} {print $6}'.

차이점은 명령줄이나 스크립트 등 다양한 위치에서 사용하는 따옴표 유형에 있습니다.

테스트를 위해 수행한 작업은 다음과 같습니다.

스크립트 파일의 이름은 "myscript"(직접 실행 가능하도록 만들었기 때문에 .sh 확장자가 없음)이며 다음을 포함합니다(다른 부분에 사용된 다른 인용문에 유의하세요!).

#!/bin/env bash
grep -i "$1" data.txt | awk -F " " '{print $5} {print $6}'

귀하의 데이터를 "data.txt"라는 파일에 넣었습니다. 명령과 출력은 다음과 같습니다.

$ ./myscript "05:00:00 AM"
C.
Jones

예상대로 작동합니다.

따라서 여기서 유일한 실제 문제는 서로 다른 인용문이 서로 다른 부분에 어떻게 영향을 미치는지 이해하려고 노력하는 것 같습니다.

awk추가하도록 편집됨: 또한 파이프 측면 에 초점을 맞춘 cbhihe의 게시물에 있는 정보에 유의하세요 . 파이프의 해당 측면은 해당 측면의 출력 에 따라 달라지기 때문에 처음에는 사용 awk(또는 다른 것) 에 대해 언급하지 않았습니다.grep

관련 정보