일부 로그 파일이 있는데 이를 수집하여 특정 줄의 발생 횟수를 계산해야 합니다.
문제는 첫 번째 파일의 특정 줄부터 시작하여 해당 줄 이후의 항목만 계산해야 한다는 것입니다. 다른 모든 파일은 철저하게 검색해야 합니다. 첫 번째 파일만 마지막 x 줄로 제한하면 됩니다.
그런 다음 결과에 200을 곱해야 합니다. 하나의 명령으로 이 작업을 수행하고 싶습니다.
이것은 2개의 로그 파일을 사용하는 실제 예제이지만 곧 이를 3개의 파일로 확장해야 하며 누군가가 이를 수행하는 더 나은 방법을 알아낼 수 있기를 바랍니다.
expr `tail -n 5147 Log1.log.2013-11-18 | grep "The line I need to count" | wc -l` + `cat Log2.log | grep "The line I need to count" | wc -l` | awk '{print $1"*200"}' | bc
답변1
두 번째 고양이 다음에 세 번째 파일을 추가할 수 있어야 한다고 생각합니다.
expr `tail -n 5147 Log1.log.2013-11-18 | grep "The line I need to count" | wc -l` + `cat Log2.log Log3.log | grep "The line I need to count" | wc -l` | awk '{print $1"*200"}' | bc
예:
$ echo abc > 1.txt
$ echo cde > 2.txt
$ echo def > 3.txt
$ cat 1.txt 2.txt 3.txt | grep d
cde
def
답변2
파일 수에 관계없이 일반적인 솔루션:
for file1 in log1.txt log2.txt logN.txt; do
for file2 in logA.txt logB.txt logC.txt; do
for file3 in logD.txt logE.txt logF.txt; do
match1=$(tail -n 5147 $file1 | grep -c 'The line');
match2=$(grep -c "the line" $file2);
match3=$(grep -c "the line" $file3);
echo "($match1 + $match2 + $match3) * 200" | bc;
done;
done;
done
the line
그러면 각 s의 마지막 5147개 행에서 발생 횟수를 계산하고 로 $file1
저장합니다 $match1
. 그런 다음 각 s에서 발생 횟수를 계산 하고 로 저장합니다 . 그런 다음 계산합니다.the line
$file2
match2
file3
$match3
($match1 + $match2 + $match3) * 200
수행 중인 작업에 파일을 추가하고 구문을 수정하기만 하면 됩니다.
echo "$(tail -n 5147 Log1.log.2013-11-18 | grep -c 'The line') \
$(grep -c 'The line' Log2.log) $(grep -c 'The line' Log3.log)" |
awk '{print ($1+$2+$3)*200}'
다음은 몇 가지 팁입니다. grep -c
일치 항목을 인쇄하는 대신 계산하므로 필요하지 않습니다 wc
. awk
수학을 수행할 수 있으므로 필요하지 않습니다 bc
. 나는 더 이상 셸에서 산술 연산을 수행하지 않기 때문에 echo
대신 사용합니다 expr
. 세 가지 검색 결과를 에코하고 에 전달하면 다음 awk
과 같은 결과가 나옵니다.
echo "10 4 12" | awk '{print ($1+$2+$3)*200}'
더 간결한 버전:
echo $((($(tail -n 5147 Log1.log.2013-11-18 | grep -c "The line) + \
$(grep -c "The line" Log2.log) + $(grep -c "The lne" Log3.log)) * 200))
이것은 기호를 사용하여 쉘에서 모든 수학 연산을 수행합니다 $(( ))
. 시도해 볼 수 있습니다 echo $((2*4))
. 읽기가 쉽지는 않지만 다음과 같이 확장됩니다.
echo "$(( ($file1_matches + $file2_matches + $file3_matches) * 200 ))"
답변3
여러 CSV 파일에서 행을 계산하는 비슷한 문제를 해결했습니다.
스크립트의 출력인 CSV 파일의 큰 목록이 있으므로 동일한 필드를 갖습니다. 유효한 값이 있는 행 수에 관심이 있습니다.
이 트릭을 수행하는 명령은 다음과 같습니다.
awk -F, '{if ($5>0.0) print $5}' va.2021-04-11.153123.csv va.2021-04-11.111709.csv | wc -l
-F,
구분 기호 설정,
(내 CSV 파일은,
구분되어 있음)'{if ($5>0.0) print $5}'
awk
무엇을 해야 할지 알려주는 "스크립트"입니다.- 5번째 필드가
0.0
5번째 필드보다 큰 경우 wc
그런 다음 플래그 와 함께 파이프하여-l
출력의 행 수를 계산합니다.
- 5번째 필드가
va.2021-04-11.153123.csv va.2021-04-11.111709.csv
두 개의 CSV 파일이 공백으로 구분된 목록입니다.