특정 출력을 얻으려면 매개변수를 Grep에 전달하세요.

특정 출력을 얻으려면 매개변수를 Grep에 전달하세요.

저는 유닉스를 처음 접했습니다. 혼자 배우고 있어요... 디렉토리에 있는 여러 파일에서 검색하여 지정된 시간에 근무 중인 딜러의 이름을 추출하는 간단한 쉘 스크립트를 작성하고 있습니다.

아이디어는 파일 날짜(예: 0310) 또는 파일의 시간(예: 05) 또는 파일의 시간 유형(AM 또는 PM)을 전달하여 근무 중이던 특정 딜러를 끌어낼 수 있어야 한다는 것입니다. 그때.

다음 스크립트를 사용하여 데이터를 추출할 수 있습니다.

grep -i '05' 0310* | awk -F " " '{print $(01) , $(02) , $(05) , $(06)}' | grep -i am > Dealers_working_during_losses.txt

그러면 오전 5시에 파일 이름 0310_Dealer_Analytic에 나열된 모든 딜러의 이름이 제공됩니다. 이제 누구나 스크립트를 사용할 수 있도록 날짜, 시간, 시간 유형을 매개변수로 제공할 수 있도록 스크립트를 생성해야 합니다. 진행 방법을 알려주십시오. 저는 꿀벌을 처음 접하기 때문에 복잡한 것보다 논리를 이해할 수 있도록 간단한 솔루션에 감사하겠습니다 ...

아래는 샘플 파일 데이터입니다. 룰렛 딜러에 대한 데이터를 추출하면 됩니다.

Hour AM/PM BlackJack_Dealer_FNAME LAST Roulette_Dealer_FNAME LAST Texas_Hold_EM_dealer_FNAME LAST

12:00:00 AM Izabela Parrish Marlene Mcpherson Madina Britton
01:00:00 AM Billy Jones Saima Mcdermott Summer-Louise Hammond
02:00:00 AM Summer-Louise Hammond Abigale Rich John-James Hayward
03:00:00 AM John-James Hayward Evalyn Howell Chyna Mercado

답변1

먼저 기존 스크립트를 정리하겠습니다.

1) -igrep의 arg는 소문자 비교를 위한 것이므로 숫자에 사용하는 것은 의미가 없습니다. 그러니 그냥 제거하세요 -ifrom grep -i '05' 0310*.

2) " "는 awk의 기본 FS 값이므로 지정할 필요가 없습니다 -F " ". 그냥 제거하면 됩니다.

3) 입력 필드 번호는 2자리일 필요가 없으며, 괄호로 묶어 구분할 필요도 없으므로 각 등은 등이 $(01)될 수 있습니다 .$1

4) awk를 사용하면 grep이 필요하지 않으므로 다음과 같습니다.

grep '05' 0310* |
awk '{print $1, $2, $5, $6}' |
grep -i am > Dealers_working_during_losses.txt

다음과 같이 쓸 수 있습니다:

awk '/05/{$0=$1 OFS $2 OFS $5 OFS $6; if (tolower($0) ~ /am/) print}' 0310* > Dealers_working_during_losses.txt

이제 기존 오류를 수정해 보겠습니다.

5) /05/찾을 것이다05 어딘가에레코드(예: 분 필드)에 있지만 시간 지정이 있는 레코드의 시작 부분에서만 찾고 싶으므로 로 변경합니다 /^05/.

6) 마찬가지로 grep -i am완료 한 대로 기록의 어느 곳에서나(예: 사람 이름) 찾을 tolower($0) ~ /am/수 있지만 am기록의 두 번째 필드인 경우에만 찾고 싶으므로 다음으로 변경합니다.tolower($2) == "am"

이제 다음 명령이 있습니다.

awk '/^05/{$0=$1 OFS $2 OFS $5 OFS $6; if (tolower($2) == "am") print}' 0310* > Dealers_working_during_losses.txt

하지만 오전 또는 오후에만 테스트하므로 $2테스트하고 인쇄하기 전에 완전히 새로운 기록($0)을 만들 필요는 없으며 대신 다음과 같이 할 수 있습니다.

awk '/^05/{if (tolower($2) == "am") print $1, $2, $5, $6}' 0310* > Dealers_working_during_losses.txt

다음과 같이 좀 더 관용적으로 쓸 수 있습니다.

awk '/^05/ && (tolower($2) == "am") {print $1, $2, $5, $6}' 0310* > Dealers_working_during_losses.txt

이제 모든 값 인수를 허용하는 쉘 스크립트를 작성하는 방법을 보여 드리겠습니다. 그건:

#!/usr/bin/env bash

awk -v time="$2" -v ampm="$3" '($0 ~ ("^"time)) && (tolower($2) == tolower(ampm)) {print $1, $2, $5, $6}' "$1"* > Dealers_working_during_losses.txt

위의 내용이 foo이라는 실행 파일에 저장되어 있다고 가정하면 PATH다음과 같이 호출할 수 있습니다.

foo 0310 05 am

위에서 명확하지 않은 유일한 점은 리터럴 값( ^05) 을 테스트하여 "^"문자열을 변수 값과 연결하여 생성된 문자열로 이동할 때 시간 비교를 위해 다른 구문을 사용해야 한다는 time것입니다. 정규식 컨텍스트 문자열에서 다음을 사용해야 합니다.동적 정규식/.../이는 또한 상수 정규식 비교의 단축키를 사용할 수 없음을 의미하므로 해당 부분도 $0 ~ /.../작성해야 합니다 .$0 ~

관련 정보