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/stdout
usr1로 로그인하고 또 다른 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