programing

STDOUT의 n번째 줄을 가져오는 명령

oldcodes 2023. 4. 29. 09:53
반응형

STDOUT의 n번째 줄을 가져오는 명령

STDOUT의 n번째 줄을 얻을 수 있는 bash 명령어가 있습니까?

즉, 이것을 가져갈 무언가가

$ ls -l
-rw-r--r--@ 1 root  wheel my.txt
-rw-r--r--@ 1 root  wheel files.txt
-rw-r--r--@ 1 root  wheel here.txt

그리고 비슷한 것을 합니다.

$ ls -l | magic-command 2
-rw-r--r--@ 1 root  wheel files.txt

스크립트를 다시 사용해야 할 때는 이것이 좋지 않은 관행이라는 것을 알고 있지만, 셸과 매일 작업할 때는 그러한 방식으로 STDOUT를 필터링할 수 있으면 유용할 것입니다.

저는 이것이 쓰기 위한 반-사소한 명령이라는 것도 알고 있습니다(STDOUT 버퍼링, 특정 행 반환). 하지만 이를 수행할 수 있는 표준 셸 명령이 있는지 알고 싶습니다. 스크립트를 제자리에 놓지 않고도 사용할 수 있습니다.

사용.sed다양성을 위해:

ls -l | sed -n 2p

필요한 라인이 인쇄될 때 입력을 읽는 것이 중단되므로 더 효율적으로 보이는 이 대안을 사용하면 공급 프로세스에서 SIGPIPE가 생성될 수 있으며, 이는 다음과 같은 원하지 않는 오류 메시지를 생성할 수 있습니다.

ls -l | sed -n -e '2{p;q}'

저는 그것을 충분히 자주 보아왔기 때문에 보통 첫 번째를 사용합니다(어쨌든 타이핑하는 것이 더 쉽습니다).lsSIGPIPE를 받을 때 불만을 표시하는 명령이 아닙니다.

라인 범위:

ls -l | sed -n 2,4p

여러 라인 범위의 경우

ls -l | sed -n -e 2,4p -e 20,30p
ls -l | sed -n -e '2,4p;20,30p'
ls -l | head -2 | tail -1

멋진 헤드/테일 방식의 대안:

ls -al | awk 'NR==2'

또는

ls -al | sed -n '2p'

sed1 라인에서:

# print line number 52
sed -n '52p'                 # method 1
sed '52!d'                   # method 2
sed '52q;d'                  # method 3, efficient on large files

awk1줄에서:

# print line number 52
awk 'NR==52'
awk 'NR==52 {print;exit}'          # more efficient on large files

완전성을 위해 ;-)

단축 부호

find / | awk NR==3

짧은 수명

find / | awk 'NR==3 {print $0; exit}'

사용해 보세요.sed버전:

ls -l | sed '2 ! d'

"두 번째 줄이 아닌 줄은 모두 삭제"라고 쓰여 있습니다.

awk를 사용할 수 있습니다.

ls -l | awk 'NR==2'

갱신하다

위의 코드는 off-by-one 오류로 인해 우리가 원하는 것을 얻지 못할 것입니다. ls -l 명령의 첫 번째 줄은 전체 줄입니다.이를 위해 다음과 같은 수정된 코드가 작동합니다.

ls -l | awk 'NR==3'

다른 포스터가 제안했습니다.

ls -l | head -2 | tail -1

하지만 헤드를 꼬리에 연결하면 N 라인까지의 모든 것이 두 번 처리되는 것처럼 보입니다.

꼬리를 머리에 끼웁니다.

ls -l | tail -n +2 | head -n1

더 효율적일까요?

Perl을 쉽게 사용할 수 있습니까?

$ perl -n -e 'if ($. == 7) { print; exit(0); }'

분명히 당신이 원하는 숫자를 7로 대체하세요.

예, Jonathan Leffler가 이미 지적했듯이 가장 효율적인 방법은 print & quit과 함께 sed를 사용하는 것입니다.

set -o pipefail                        # cf. help set
time -p ls -l | sed -n -e '2{p;q;}'    # only print the second line & quit (on Mac OS X)
echo "$?: ${PIPESTATUS[*]}"            # cf. man bash | less -p 'PIPESTATUS'

음.

제 경우에는 sed가 작동하지 않았습니다.제안합니다.

"홀수" 라인 1,3,5,7...ls |filename '0 == (NR+1) % 2'

짝수 라인 2,4,6,8 ls | '0 == (NR) % 2'를 반환합니다.

완성도를 높이기 위해..

ls -l | (for ((x=0;x<2;x++)) ; do read ; done ; head -n1)

두 번째 줄에 도달할 때까지 줄을 버리고, 그 다음에 첫 번째 줄을 출력합니다.그래서 세 번째 줄을 인쇄합니다.

두 번째 줄이면..

ls -l | (read; head -n1)

필요한 만큼 '읽기'를 입력합니다.

언급URL : https://stackoverflow.com/questions/1429556/command-to-get-nth-line-of-stdout

반응형