저는 스크립팅을 처음 접했고 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:00
AM
05: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 이전에 나타나는 항목이 한 번 이상 나타나야 함을 의미합니다.
그러나 위의 내용은 전체 줄을 인쇄합니다. 관리자의 이름만 출력하려면 awk
not grep
및 다음을 사용하세요 awk
.
awk -v time=$1 -v suffix=$2 'BEGIN {pattern_ere=time"[[:blank:]]+"suffix} $0 ~ pattern_ere {print $5, $6}' infile
... awk
FS=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
단순히 실행하도록 설정된 것으로 가정하겠습니다 ).myscript
sh 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