터미널 에코로 인해 출력이 복잡해지지 않고 grep과 같은 명령에 복사하여 붙여넣으시겠습니까?

터미널 에코로 인해 출력이 복잡해지지 않고 grep과 같은 명령에 복사하여 붙여넣으시겠습니까?

다음과 같은 테스트 출력이 있습니다.

PASS: tests/test_mutex_rmw
PASS: tests/test_mutex_trylock
PASS: tests/test_malloc_irreg
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
PASS: tests/test_groups
PASS: tests/test_group_split
PASS: tests/test_malloc_group
FAIL: tests/test_accs
FAIL: tests/test_accs_dla

출력을 필터링하여 실패만 확인하고 싶습니다. 화면에서 텍스트를 복사하여 stdin에 붙여넣고 grep에 전달하는 것이 편리할 것입니다. 예:

grep FAIL

텍스트를 복사하려면 Shift-Ctrl-V(또는 마우스 가운데 버튼)를 사용하세요.

내가 보고 싶은 건 전부야

FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
FAIL: tests/test_accs
FAIL: tests/test_accs_dla

그러나 대신 붙여넣은 입력이 화면에 표시되고 버퍼링으로 인해 입력이 최종 출력과 혼합됩니다.

$ grep FAIL
PASS: tests/test_mutex_rmw
PASS: tests/test_mutex_trylock
PASS: tests/test_malloc_irreg
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
PASS: tests/test_groups
PASS: tests/test_group_split
PASS: tests/test_malloc_group
FAIL: teFAIL: tests/ARMCI_PutS_latency
sts/test_accs
FAIL: tests/test_accs_dla
FAIL: tests/ARMCI_AccS_latency
FAIL: tests/test_accs
FAIL: tests/test_accs_dla

입력을 cat에 먼저 공급한 다음 grep에 전달하는 것이 합리적이지만 cat | grep FAIL실제로는 도움이 되지 않습니다. 버퍼 혼합이 계속 발생합니다.

물론, grep에 전달된 파일에 데이터를 넣으면 깔끔하게 필터링이 가능합니다. 하지만 내가 찾고 있는 것은 클립보드 버퍼를 통해 터미널 출력에서 ​​복사된 텍스트를 간단하게 필터링할 수 있는 편리한 도구입니다. 이를 수행하는 가장 좋은 방법은 무엇입니까?

마찬가지로 화면에 에코되지 않고(데이터를 명령의 표준 입력으로 자동 제공) 붙여넣기를 수행하려면 어떻게 해야 합니까?

한 가지 방법은 에코를 명시적으로 끄는 것입니다.

stty -echo; grep FAIL; stty echo

이것은 작동하지만 stty를 전환하지 않고도 이를 수행할 수 있는 방법이 있을 것으로 생각됩니다. 다른 쉘 기반 방법을 알고 있습니까?

저는 (Debian GNU/Linux에서) bash를 사용하지만 POSIX 쉘 솔루션도 흥미롭습니다.

답변1

마우스로 텍스트를 표시한 후 다음을 사용하십시오 xclip.

xclip -o | grep FAIL

또는 클립보드에서 복사(Ctrl-c):

xclip -selection clipboard -o | grep FAIL

또는:

xclip -sel c -o | grep FAIL

요컨대.

답변2

bashBourne 또는 기타 Bourne과 유사한 쉘을 사용하는 경우 다음을 사용할 수 있습니다.here-document. 명령을 시작 grep FAIL << 'EOF'하고 Enter를 누르십시오. Bash는 >터미널에서 더 많은 명령이 필요함을 나타내는 기호와 함께 프롬프트를 표시합니다. 그런 다음 입력 내용을 붙여넣고 EOF별도의 줄에 입력하세요. 이 줄 뒤에 의 출력이 grep나타납니다 EOF.

$ grep FAIL << 'EOF'
> PASS: tests/test_mutex_rmw
PASS: tests/test_mutex_trylock
PASS: tests/test_malloc_irreg
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
PASS: tests/test_groups
PASS: tests/test_group_split
PASS: tests/test_malloc_group
FAIL: tests/test_accs
FAIL: tests/test_accs_dla
EOF
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
FAIL: tests/test_accs
FAIL: tests/test_accs_dla

EOF참조 연산자 참조(또는 그 일부)를 사용하여 여기 문서 내에서 매개변수 확장, 명령 대체 또는 산술 확장이 수행되지 않고 \문자가 손상되지 않았는지 확인 하십시오 .

키 입력 수를 최소화하려면 다음을 수행할 수 있습니다.

grep FAIL<<\.
<paste-text-here>
.

답변3

sponge다 흡수해서 사용하시면 됩니다표준 입력글을 쓰기 전에표준 출력. (데비안에서는 패키지에 있습니다 moreutils.)

grep FAIL | sponge

또는

sponge | grep FAIL

없는 경우 sponge다음과 같이 POSIX 코드를 사용하여 간단한 근사치를 구현할 수 있습니다.

#!/bin/sh
[ -n "$1" ] && exec 1>"$1"
umask 077
tmp="${TMPDIR:-/tmp}/${0##*/}.$$.tmp"
cat >"$tmp"
cat "$tmp"
rm -f "$tmp"

너 정말 sponge갖고 싶다고 했잖아."표준 입력을 에코하지 않는 옵션"메아리가 없네표준 입력. 당신이 보고 있는 것은 입력된 텍스트를 에코하는 기본값으로 남겨진 터미널 드라이버의 기능입니다. 저는 이런 기능을 자주 사용하는 편이에요

esponge() {
    local g ss
    if [ -t 0 ]
    then
        g=$(stty -g)
        stty -echoe
    fi
    sponge "$@"
    ss=$?
    [ -n "$g" ] && stty "$g"
    return $ss
}

esponge | grep FAIL

sponge또 다른 대안이지만 POSIX를 통해 입력을 보내는 것과 동일 tac하지만 POSIX가 없는 일부 시스템에 설치될 수 있습니다 sponge.

tac | tac | grep FAIL

또는 각 인스턴스를 tac다음 중 하나로 대체합니다.이러한 POSIX 대안

답변4

단순히 붙여넣은 텍스트를 에코를 통해 파이핑하면 어떤 문제가 있나요? 적어도 그것은 당신과 같은 간단한 텍스트에는 잘 작동합니다. 기억해야 할 유일한 것은 이 대사를 인용하는 것입니다. 따라서 echo "필요에 따라 를 작성하고, 텍스트를 붙여넣고, 따옴표를 닫고, 파이프할 수 있습니다. (귀하의 예에서와 같이 echo텍스트가 손상되지 않았다고 가정합니다 . 제어 문자 등으로 인해 에코 문제가 발생할 수 있습니다.)

$ echo "PASS: tests/test_mutex_trylock
PASS: tests/test_malloc_irreg
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
PASS: tests/test_mutex_trylock
PASS: tests/test_malloc_irreg
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
PASS: tests/test_groups
PASS: tests/test_group_split
PASS: tests/test_malloc_group
FAIL: tests/test_accs
"| grep FAIL
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
FAIL: tests/ARMCI_PutS_latency
FAIL: tests/ARMCI_AccS_latency
FAIL: tests/test_accs

입력과 출력이 명확하게 구분됩니다. 이 방법은 가장 간단한 *nix 명령만 사용하며 여기에 설명된 구문보다 기억하기가 더 쉽습니다.

텍스트를 명령으로 사용하려면 너무 길지 않은 텍스트에 대해 명령 대체로 echo를 사용할 수 있습니다.

나는 xclip에 대해 모르고 msys2에는 xclip이 없는 것 같아서 계속해서 내 멍청한 방법을 사용할 것입니다.명령 대체방법. 버퍼 내용을 에코하고 이를 원하는 명령에 대한 명령줄 인수로 만듭니다.

왜냐하면텍스트여러 줄의 붙여넣은 콘텐츠로 구성됩니다(반향하거나 완전히 바꾸지는 않음).인용해야 합니다.

왜냐하면명령 대체가 인용되지 않았습니다.쉘은 에코 출력을 다시 개별 단어로 구문 분석합니다.

아래 예는 확실히 더 잘 해결될 수 있지만 find ... -print0(무엇보다도 공백이 있는 파일 이름은 여기서 작동하지 않습니다) 요점을 보여줍니다. (경로에 공백을 넣는 사람은 어쨌든 컴퓨터 접근 금지 명령을 받아야 합니다. 예, Bill, 제가 말하는 것입니다.)

$ ls -1 a*
a1
a2
a3
a4
a5
aa
$ ls -l $(echo "a1
a2
a3
a4
a5
aa
")
-rw-r--r-- 1 Peter None 0 Mar 11 11:59 a1
-rw-r--r-- 1 Peter None 0 Mar 11 11:59 a2
-rw-r--r-- 1 Peter None 0 Mar 11 11:59 a3
-rw-r--r-- 1 Peter None 0 Mar 11 11:59 a4
-rw-r--r-- 1 Peter None 0 Mar 11 11:59 a5
-rw-r--r-- 1 Peter None 0 Mar 11 11:58 aa

관련 정보