로그 디렉터리 아래에 로그를 출력하기 위해 bash 스크립트를 실행하고 있습니다. 처음에는 다음을 수행하여 생성된 로그 수를 알고 싶었습니다.
ls logs | wc -l
bash 스크립트가 실시간으로 실행되므로 다음을 추가로 사용할 수 있습니다.
watch -n 5 'ls logs | wc -l'
동시 로그 파일 수를 표시합니다.
하지만 다음과 같은 파일 아래의 줄 수를 확인하여 총 로그 파일 수를 생성해야 한다는 것도 알고 있습니다 file.txt
.
cat file.txt | wc -l
이제 두 숫자를 빼서 생성해야 하는 로그가 얼마나 더 많은지 보여주고 싶습니다. 검색해 보니 expr
이중 괄호를 사용하거나 사용하는 등 셸에서 수학을 수행하는 여러 가지 방법이 있습니다. 예를 들어 총 행 수가 file.txt
1000개라고 가정해 보겠습니다. 이것을 명령에 하드코딩하면 최종 명령은 다음과 같습니다.
`watch -n 5 'ls 로그 | xargs expr 1000 - '
1000
하지만 대신 명령의 결과를 사용하고 싶습니다 cat file.txt | wc -l
. 다음을 시도했지만 작동하지 않습니다. xargs
2개의 명령에서 두 개의 인수를 받아도 괜찮은지, 아니면 여기서는 그렇게 사용하지 않는지 잘 모르겠습니다 .
watch -n 5 'ls logs | wc -l | xargs expr "cat file.txt | wc -l" + '
file.txt
(참고: 문자로 시작하지 않고 빈 줄이 아닌 줄만 세고 싶다면 어떻게 해야 합니까 #
? 여기서는 어떻게 해야 합니까?) 정말 감사합니다.
답변1
xargs
2개의 명령에서 2개의 매개변수를 받는 것이 가능한지 잘 모르겠습니다 .
여러 입력 줄에 분산된 여러 매개 변수를 사용하여 명령을 실행할 수 있습니다. 예를 들어, 다음은 xargs
입력에서 가져온 세 개의 매개변수 expr
(순서대로 로그 수 -
와 의 행 수 file.txt
) 를 사용하여 실행하도록 지시합니다 .
(ls logs | wc -l; printf "%s\n" -; wc -l < file.txt) | xargs -n 3 expr
사용하는 것이 더 관용적일 수 있습니다.명령 대체여기:
expr "$(ls logs | wc -l)" - "$(wc -l < file.txt)"
[W]file.txt에서 # 문자로 시작하지 않고 빈 줄이 아닌 줄 수만 계산하려면 어떻게 해야 합니까?
세다 grep
:
grep -c -v -e '^#' -e '^$' file.txt
-c
일치하는 행 수 계산-v
다음과 일치하지 않는 행이 선택되도록 일치를 반전합니다.-e '^#
^
( )로 시작하는 행 일치#
-e '^$
$
start ( ) 바로 뒤에 끝나는 ( ) 행 과 일치합니다^
. 즉, 비어 있습니다.