변수에 출력 라인 수 할당

변수에 출력 라인 수 할당

bash 스크립트에서 명령을 실행하고 마지막에 인쇄된 줄 수를 인쇄하는 방법은 무엇입니까?

awk에 해당하는 것은 다음과 같습니다.

{ print; } 
END { print NR; }

나는 다음을 생각 해낼 수 있습니다. 현재 이것은 작동하지만 서브셸 외부에서는 가져올 수 없습니다.

| (lc=0; while read; do echo $REPLY; lc=$(($lc+1)); done; echo $lc)

고쳐 쓰다

내 문제는 완전히 다른 것 같습니다. 실패한 첫 번째 시도는 다음과 같습니다 /dev/stdout.

tester> { echo abc | tee /dev/stdout | wc -l;  } > /tmp/abc; cat /tmp/abc
2

tee /dev/stdout이는 오류가 발생했기 때문인 것 같습니다 .

tester> echo abc | tee /dev/stdout
tee: /dev/stdout: Permission denied
abc

이것답변제프 샬러의 작품:

tester> { echo abc | tee >(wc -l);  } > /tmp/abc; cat /tmp/abc
abc
1

그러나 오늘 아침에 다시 시도했을 때 효과가 있다는 것을 알았습니다!

tmp> echo abc | tee /dev/stdout
abc
abc

일정 기간의 연구 끝에 두 가지 문제점을 발견했습니다.

어제 실패했을 때 |tee /dev/stdoutusr1로 로그인하고 또 다른 usr2를 sudo했습니다 sudo su usr2. 이 경우 소프트 링크 체인은 /dev/stdout -> /proc/self/fd/1 -> /dev/pts/1이고 마지막 링크의 소유자는 입니다 usr1. 그래서 tee실패했습니다. 오늘 나는 usr1로 시도해 보았는데 효과가 있었습니다.

그러나 내가 깨달은 또 다른 오류 tee /dev/stdout는 모든 출력이 로 이동하고 wc -l행 수가 두 배이고 아무것도 인쇄되지 않는다는 것입니다.

답변1

줄 수를 더 잘 인쇄하는 방법을 잘 모르겠습니다.

$ seq 1 5 2>&1 | tee >(wc -l | { read lines; echo Lines of output: $lines; })
1
2
3
4
5
$ Lines of output: 5

이는 seq 1 5명령의 (여기) stderr을 stdout으로 리디렉션하여 두 스트림이 모두 표시되도록 합니다. 그런 다음 tee의 입력을 다시 복사하고 행 수를 계산하기 위해 실행되는 대체 프로세스 tee에 입력을 복사합니다 . 그런 다음 출력을 변수 로 wc -l읽어 보고서를 제공합니다.wc$lines

답변2

사용 sed:

some_command | sed -n 'p;$='

예를 들어:

$ touch file.{a..k}
$ printf '%s\n' * | sed -n 'p;$='
file.a
file.b
file.c
file.d
file.e
file.f
file.g
file.h
file.i
file.j
file.k
11

스크립트 sed는 단순히 입력을 출력에 복사하고 인쇄 명령( p)을 입력의 각 줄에 적용하지만 마지막 줄( $)의 경우 줄 번호( =)도 인쇄합니다.

답변3

간단히 awk 명령을 사용할 수 있습니다.

echo -e "foo\nbar"| awk '{ 인쇄 }END { 인쇄 }'
부자
술집
2

관련 정보