하나의 명령줄을 사용하여 다른 두 명령의 결과로 두 정수의 뺄셈을 계산하는 방법

하나의 명령줄을 사용하여 다른 두 명령의 결과로 두 정수의 뺄셈을 계산하는 방법

로그 디렉터리 아래에 로그를 출력하기 위해 bash 스크립트를 실행하고 있습니다. 처음에는 다음을 수행하여 생성된 로그 수를 알고 싶었습니다.

ls logs | wc -l

bash 스크립트가 실시간으로 실행되므로 다음을 추가로 사용할 수 있습니다.

watch -n 5 'ls logs | wc -l'

동시 로그 파일 수를 표시합니다.

하지만 다음과 같은 파일 아래의 줄 수를 확인하여 총 로그 파일 수를 생성해야 한다는 것도 알고 있습니다 file.txt.

cat file.txt | wc -l

이제 두 숫자를 빼서 생성해야 하는 로그가 얼마나 더 많은지 보여주고 싶습니다. 검색해 보니 expr이중 괄호를 사용하거나 사용하는 등 셸에서 수학을 수행하는 여러 가지 방법이 있습니다. 예를 들어 총 행 수가 file.txt1000개라고 가정해 보겠습니다. 이것을 명령에 하드코딩하면 최종 명령은 다음과 같습니다.

`watch -n 5 'ls 로그 | xargs expr 1000 - '

1000하지만 대신 명령의 결과를 사용하고 싶습니다 cat file.txt | wc -l. 다음을 시도했지만 작동하지 않습니다. xargs2개의 명령에서 두 개의 인수를 받아도 괜찮은지, 아니면 여기서는 그렇게 사용하지 않는지 잘 모르겠습니다 .

watch -n 5 'ls logs | wc -l | xargs expr "cat file.txt | wc -l" + '

file.txt(참고: 문자로 시작하지 않고 빈 줄이 아닌 줄만 세고 싶다면 어떻게 해야 합니까 #? 여기서는 어떻게 해야 합니까?) 정말 감사합니다.

답변1

xargs2개의 명령에서 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 ( ) 바로 뒤에 끝나는 ( ) 행 과 일치합니다 ^. 즉, 비어 있습니다.

관련 정보