첫 번째 일치 항목만 한 번만 인쇄

첫 번째 일치 항목만 한 번만 인쇄

로그 파일을 구문 분석하고 필요한 정보를 인쇄하는 데 사용하는 코드 조각이 있습니다.

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk '/\([a-zA-Z0-9.]+/ {print $7}' 
 done;

문제는 입력을 입력하면 답변이 여러 번 표시된다는 것입니다.

(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.284.3.17454802.933.1401109176.280.1)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.284.3.17454802.933.1401109176.283.1)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109696.2)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109706.51)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109758.100)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109773.149)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109810.198)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109818.247)

첫 번째 데이터 시리즈를 한 번만 표시할 수 있도록 이를 다듬을 수 있는 방법이 있습니까? 1.3.51.0.1.1.10.10.30.48.2084865.2084839한 번만 인쇄하면 됩니다 .

나도 이것을 이것으로 바꾸려고 했지만 Bash는 그것을 좋아하지 않습니다:

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk '/\([a-zA-Z0-9.]+/' |
        awk -F'[(/]' ' {print $2, exit}'
done;

그런 다음 이것을 시도했습니다.

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk -F'[(/]' '/\([a-zA-Z0-9.]+/ {print $2, exit }'
done;

답변1

이 시도,

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk '/\([a-zA-Z0-9.]+/ {print $7; exit}' 
done;

exitawk 명령은 첫 번째 일치 항목을 인쇄한 후 종료됩니다.

또는

명령 의 출력을 for아래 awk 명령으로 파이프하면 됩니다.

for .... | awk -F'[(/]' '{print $2;exit}'

답변2

루프 가 필요하지 않습니다 for. 단일 호출로 grep파일에서 일치하는 모든 라인이 출력되므로 파일에 있는 라인 수만큼 동일한 작업을 계속 반복하면 됩니다.

awk기술적으로 둘 다 텍스트 일치를 수행할 수 있으므로 둘 다 필요하지 않습니다 grep. 보다 구체적인 답변을 원할 경우 로그 파일의 추출 내용과 원하는 출력의 예를 게시하세요.

답변3

실제로 무엇을 하고 있는지 설명하지 않았으므로 몇 가지 가정을 하겠습니다. 나는 당신이 이라는 스크립트를 실행 foo.sh하고 문자열과 파일 이름을 인수로 제공한다고 가정합니다. 그러면 이것들은 각각 $1및 가 됩니다 $2. 아마도 다음과 비슷한 것으로 실행하고 있을 것입니다.

foo.sh SearchPattern LogFileName

어쨌든 루프는 i) 루프 에 의해 생성된 변수를 for사용하지 않기 때문에 완전히 쓸모가 없습니다 . ii) 각각의 값을 취 하게 되므로 매우 잘못된 것입니다.ifor i in ...i단어그리고 아마도 당신이 생각했던 전체 라인이 아닙니다. iii) 모든 문제의 원인. 똑같은 명령을 여러 번 실행하기 때문에 동일한 결과가 여러 번 나타납니다. 파일의 각 줄에 대해 하나의 결과를 얻게 됩니다.

어쨌든, 당신이 원하는 것은 다음과 같은 간단한 것으로 이루어질 수 있습니다.

grep "$1" ~/jlog/"$2" | awk '/\([a-zA-Z0-9.]+/ {print $7}' 

또는 더 간단하게:

awk '/'"$1"'/\([a-zA-Z0-9.]+/ {print $7}' ~/jlog/"$2"

작은 따옴표 안에는 없습니다 awk. 이렇게 하면 bash는 에 전달되기 전에 "$1"현재 보유하고 있는 모든 항목으로 확장합니다 .$1awk

관련 정보