로그 파일을 구문 분석하고 필요한 정보를 인쇄하는 데 사용하는 코드 조각이 있습니다.
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;
exit
awk 명령은 첫 번째 일치 항목을 인쇄한 후 종료됩니다.
또는
명령 의 출력을 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) 각각의 값을 취 하게 되므로 매우 잘못된 것입니다.i
for 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"
현재 보유하고 있는 모든 항목으로 확장합니다 .$1
awk