유닉스에서 탭을 잡다


417

grep유닉스 플랫폼의 파일에서 탭 (\ t)을 어떻게합니까 ?


53
그냥 사용하십시오 grep "<Ctrl+V><TAB>", 그것은 작동합니다 (처음 입력 : grep "Ctrl + V 키 콤보를 누른 다음 Tab 키를 누른 다음 Enter 키를 누르십시오 "!)
rook

16
ctrl + v는 정말 나쁜 아이디어입니다! ... 예 콘솔 명령으로 작동 할 수 있지만 스크립트로 입력 할 수없는 경우가 있습니다 (예 : mcedit 및 ctrl + v를 사용하지 않음)
편집자

관련이 있지만 중복은 아님 : 'grep'을 사용하여 -P가없는 탭 검색
Peter Mortensen

참조 : askubuntu.com/questions/53071/… (아래 링크)
shiri

답변:


374

GNU grep을 사용하는 경우 Perl 스타일 regexp를 사용할 수 있습니다.

grep -P '\t' *

내 패턴에 맞지 않는 것 같습니다. 이 구문을 사용하려고하면 아무 것도 인쇄되지 않습니다. (Mac OS X 변형이 다른가?)
futureelite7

2
@futureelite : Apple의 문서 ( developer.apple.com/Mac/library/documentation/Darwin/Reference/… )에 따르면 Mac OS X grep 프로그램은 -P 옵션을 지원해야합니다. superuser.com에서 새 질문을 작성해보십시오.

3
GNU UNIX에는 매우 좋지만 POSIX Solaris, AIX 및 HP-UX는 어떻습니까? 그들은 -P옵션에 대해 아무것도 모른다 .
rook

21
@rook GNU는 UNIX가 아닙니다.
Lily Chung

5
Mac OSX에서는 -e
Faisal Feroz를

314

트릭은 작은 따옴표 앞에 $ 기호를 사용하는 것 입니다. 절단 및 기타 도구 에도 적용됩니다 .

grep $'\t' sample.txt

7
생명의 끝이 생명을 구합니다! zsh내가 알 수 있는 한 잘 작동 합니다. 그 $부호 의 의미가 무엇인지 언급 할 수 있습니까?
Romain

2
문자열에 '\ t'이외의 것이 포함되어 있으면 작동하지 않습니다. 예를 들어 "\ t"(탭 + 스페이스)를 어떻게 검색 하시겠습니까?
Raman

6
라만 :을 사용할 수 있습니다 $'\t'' '. sh와 함께 작동하는 실제 예제는 bash (Android에 기본적으로 설치되지 않은 bash뿐만 아니라)입니다 busybox grep -oE '^nodev'$'\t''fuse$' /proc/filesystems.
v6ak

5
나는 $ '...'는 bash 관용구라고 생각합니다. 아마 sh에서는 작동하지 않습니다. csh 또는 tcsh에 대한 Dunno
Edward Falk

5
'man bash'에서 : $ 'string'형식의 단어는 특별히 취급됩니다. ANSI C 표준에 지정된대로 백 슬래시 이스케이프 문자를 바꾸어 단어를 문자열로 확장합니다. 백 슬래시 이스케이프 시퀀스가있는 경우 디코딩됩니다 ...
broeni

84

'\ t'메타 문자를 grep과 함께 사용할 수 없었습니다. 그러나 두 가지 대체 솔루션을 찾았습니다.

  1. 사용 <Ctrl-V> <TAB>(Ctrl-V를 누르고 탭 입력)
  2. awk 사용하기 : foo | awk '/\t/'

4
| awk '/\t/'솔루션은 모든 쉘, 플랫폼 및 시스템에서 작동합니다.
Samveen

6
휴대용 POSIX 솔루션의 경우 +1이며 bashism, zshism, GNUism 및 linuxism을 사용하지 않습니다.
Jens

1
ctrl-V는 (메모 또는 스크립트에서) 복사하여 붙여 넣기하려는 경우 유용하지 않습니다. 눈에 띄는 '\ t'인 명시 적 솔루션을 사용하는 것이 좋습니다. 문자 그대로의 TAB (즉, 공백처럼 보이는 것)은 종종
복사

awk여기에서 잘 작동하지만 파일이 매우 큰 내 컴퓨터의 일부 테스트에서는을 사용하는 것보다 약 30 % 느립니다 grep -P. 이것은 사용 사례에 따라 사소하고 관련성 awk이 없으며 가독성과 이식성에 더 좋을 수 있습니다.
theferrit32

43

에서 이 답변 우분투 질문에 :

grep에게 Perl에 의해 정의 된 정규식을 사용하도록 지시하십시오 (Perl에는 \t탭이 있음).

grep -P "\t" <file name>

리터럴 탭 문자를 사용하십시오.

grep "^V<tab>" <filename>

printf탭 문자를 인쇄하는 데 사용하십시오 .

grep "$(printf '\t')" <filename>


ctrl-V는 (메모 또는 스크립트에서) 복사하여 붙여 넣기하려는 경우 유용하지 않습니다. 눈에 띄는 '\ t'인 명시 적 솔루션을 사용하는 것이 좋습니다. 리터럴 탭 (즉, 공백처럼 보이는 탭)은 종종
복사

31

한 가지 방법은 (Bash와 함께)

grep -P '\t'

-P Perl 정규 표현식을 켜면 \ t가 작동합니다.

사용자 풀기 에서 알 수 있듯이 GNU grep에만 해당 될 수 있습니다. 대안은 쉘, 편집기 또는 터미널에서 허용하는 경우 문자 그대로 탭을 삽입하는 것입니다.


KSH 쉘에서 알 수없는 P 옵션
Sachin Chourasiya

unwind가 말했듯이 GNU grep에만 해당 될 수 있습니다. 그냥 설명했다.
tjmoore 2009

탭을 어떻게 추가합니까? 탭 버튼을 누를 때 자동 완성 프로세스가 시작되지 않습니까? (bash 스크립트에서는 작동하지만 명령 행에서는 작동하지 않을 수 있음)
AntonioCS

1
SamKrieg가 위에서 언급 한대로 @AntonioCS를 사용하면 Shell에서 문자를 입력 할 수 있도록하려면 CTRL-v를 먼저 입력하십시오. 또한 참조 askubuntu.com/questions/53071/...
데니스 아르노에게

2
-P는 쉘이 아닌 grep에만 해당됩니다. GNU grep이 설치된 경우 -P는 모든 쉘에서 작동해야합니다.
plijnzaad

13

표현식 안에 탭을 문자 그대로 삽입하는 또 다른 방법은 $'\t'Bash에서 덜 알려진 인용문을 사용하는 것입니다 .

grep $'foo\tbar'        # matches eg. 'foo<tab>bar'

(고정 문자열과 일치하는 경우 '-F'모드와 함께 사용할 수 있습니다.)

때로는 변수를 사용하면 표기법을 좀 더 읽기 쉽고 관리하기 쉽게 만들 수 있습니다.

tab=$'\t'               # `tab=$(printf '\t')` in POSIX
id='[[:digit:]]\+'
name='[[:alpha:]_][[:alnum:]_-]*'
grep "$name$tab$id"     # matches eg. `bob2<tab>323`

10

이것은 정확히 당신이 찾고있는 것이 아니지만 귀하의 경우에는 효과가있을 수 있습니다

grep '[[:blank:]]'

에 해당

grep -P '[ \t]'

스페이스와 탭을 찾을 수 있습니다.

§ 캐릭터 클래스

참고로 내 광고는 man grep없지만 여전히 작동합니다.

$ 남자 grep | 그렙 빈 | 화장실
      0 0 0

@ A-letubby 이제 편집과 함께 작동합니다. -P인수가 추가되었습니다.
villapx

6

echo를 사용하여 탭을 삽입하십시오 grep "$(echo -e \\t)"


6

기본적으로이를 해결하는 두 가지 방법이 있습니다.

  1. ( 권장 ) grep (1)에서 지원하는 정규식 구문을 사용하십시오. 최신 grep (1)은 POSIX 1003.2 정규식 구문의 두 가지 형식 인 기본 (사용되지 않는) RE와 최신 RE를 지원합니다. 구문은 각각 BSD 및 Linux 시스템의 일부인 re_format (7) 및 regex (7) 매뉴얼 페이지에 자세히 설명되어 있습니다. GNU grep (1)은 pcre (3) 라이브러리에서 제공하는 Perl 호환 RE도 지원합니다.

    정규식 언어에서 탭 기호는 일반적으로 \t원자로 인코딩됩니다 . 원자는 BSD 확장 정규 표현식 ( egrep, grep -EBSD 호환 시스템에서)과 Perl 호환 RE ( pcregrep, GNU에서 지원됩니다.grep -P )에서 지원됩니다.

    기본 정규 표현식과 Linux 확장 RE는 모두 \t . 지원하는 정규식 언어를 알려면 UNIX 유틸리티 매뉴얼 페이지를 참조하십시오 (따라서 sed (1), awk (1) 및 pcregrep (1) 정규 표현식의 차이점).

    따라서 Linux에서 :

    $ grep -P '\t' FILE ...
    

    BSD 유사 시스템에서 :

    $ egrep '\t' FILE ...
    $ grep -E '\t' FILE ...
    
  2. 탭 문자를 패턴으로 전달하십시오. 스크립트 파일을 편집 할 때 간단합니다.

    # no tabs for Python please!
    grep -q '   ' *.py && exit 1
    

    그러나 대화식 쉘에서 작업 할 때 쉘에 올바른 기호를 입력하려면 쉘 및 터미널 기능에 의존해야합니다. 대부분의 터미널에서 Ctrl+ V키 조합을 통해 터미널에서 다음 입력 문자를 문자 그대로 처리하도록 지시 할 수 있습니다 ( V"verbatim"의 경우).

    $ grep '<Ctrl>+<V><TAB>' FILE ...
    

    일부 쉘은 명령 유형 설정에 대한 고급 지원을 제공 할 수 있습니다. bash (1)에서 형식의 단어는 다음과 같이 $'string'특별하게 취급됩니다.

    bash$ grep $'\t' FILE ...
    

    그러나 명령 줄이 훌륭하지만 스크립트를 다른 플랫폼으로 옮길 때 호환성 문제가 발생할 수 있습니다. 또한 스페셜을 사용할 때 따옴표에주의하십시오. 자세한 내용은 bash (1)을 참조하십시오.

    Bourne 쉘 (및뿐만 아니라)의 경우, 올바른 정규 표현식을 구성하기 위해 printf (1)로 기능 보강 된 명령 대체를 사용하여 동일한 동작을 에뮬레이션 할 수 있습니다.

    $ grep "`printf '\t'`" FILE ...
    

4

grep "$(printf '\t')" Mac OS X에서 나를 위해 일했습니다.


2

gawk를 사용하고 필드 구분 기호를 탭 (\ t)으로 설정하고 필드 수를 확인하십시오. 1보다 크면 탭이 있습니다.

awk -F"\t" 'NF>1' file

2
이것은 약간 과잉이며 질문을 놓칩니다. awk /\t/op의 질문에 충분합니다.
제한적 속죄

2

좋은 선택은 'sed as grep'을 사용하는 것입니다 (이 고전적인 sed tutorial에 설명되어 있음 ).

sed -n 's/pattern/&/p' file

예 (bash, sh, ksh, csh, ..에서 작동) :

[~]$ cat testfile
12 3
1 4 abc
xa      c
        a       c\2
1 23

[~]$ sed -n 's/\t/&/p' testfile 
xa      c
        a       c\2

[~]$ sed -n 's/\ta\t/&/p' testfile
        a       c\2

1

+1 방법, ksh, 대시 등에서 작동합니다. printf를 사용하여 Tab을 삽입하십시오.

grep "$(printf 'BEGIN\tEND')" testfile.txt

이것은 Ubuntu Trusty (Bash 4.3.11)에서 작동하지 않았지만 다음과 같이 작동했습니다.grep "$(printf '\t')" testfile.txt
Josh Rumbut

0

대답은 더 간단합니다. grep을 작성하고 따옴표 유형 내에서 탭 키를 적어도 ksh에서 잘 작동합니다

grep "  " *

3
먼저 쉘에 TAB 문자를 입력해야합니다. 대부분의 쉘은이 키를 명령 (완료)으로 해석합니다
Kaii


0

'sed-as-grep'방법을 사용하지만 탭을 개인 취향의 보이는 문자로 바꾸는 것이 내가 가장 좋아하는 방법입니다.

sed -n 's/\t/\*\*\*\*/g' file_name

줄 / 파일 정보 또는 기타 grep 옵션을 사용하고 탭 문자의 눈에 띄는 대체물을보고 싶은 경우 다음과 같이하면됩니다.

grep -[options] -P '\t' file_name | sed 's/\t/\*\*\*\*/g'

예로서:

$ echo "A\tB\nfoo\tbar" > test
$ grep -inH -P '\t' test | sed 's/\t/\*\*\*\*/g'
test:1:A****B
test:2:foo****bar

편집 : 분명히 위의 내용은 탭을 찾기 위해 파일 내용을 볼 때만 유용합니다 --- 큰 스크립팅 세션의 일부로 탭을 처리하는 것이 유용한 경우 유용하지 않습니다.


0

이것은 AIX에서 잘 작동합니다. 포함하는 줄을 찾고 있습니다JOINED<\t>ACTIVE

voradmin cluster status | grep  JOINED$'\t'ACTIVE

 vorudb201   1       MEMBER(g) JOINED        ACTIVE
*vorucaf01   2       SECONDARY JOINED        ACTIVE

0

사용하고 싶을 수도 있습니다 grep "$(echo -e '\t')"

유일한 요구 사항은 echo백 슬래시 이스케이프를 해석 할 수 있어야한다.


0

이러한 대체 이진 식별 방법은 완전히 작동합니다. 그리고 단일 바이너리 문자의 구문 사용을 기억할 수 없으므로 awk를 사용하는 것이 정말 좋습니다. 그러나 쉘 변수에 POSIX 포터블 방식 (즉, TAB = echo "@" | tr "\100" "\011")을 지정하고 POSIX 포터블 방식으로 어디에서나 사용할 수 있어야합니다. 또한 grep "$ TAB"파일 이름). 이 솔루션은 TAB과 잘 작동하지만 TAB 문자 값이 'tr'이 아닌 할당에 다른 원하는 이진 값이 사용될 때 다른 이진 문자도 잘 작동합니다.


0

다른 답변에 주어진 $ '\ t'표기법은 쉘마다 다릅니다 .bash와 zsh에서 작동하는 것처럼 보이지만 보편적이지 않습니다.

참고 : 다음은 fish셸용이며 bash에서는 작동하지 않습니다 .

에서 fish쉘, 하나는 인용 부호로 둘러싸을 사용할 수 있습니다 \t예를 들어 :

grep \t foo.txt

또는 16 진수 또는 유니 코드 표기법을 사용할 수 있습니다. 예 :

grep \X09 foo.txt
grep \U0009 foo.txt

(이 표기법은 난해한 캐릭터에게 유용합니다)

이러한 값은 따옴표로 묶지 않아야하기 때문에 따옴표와 따옴표없는 값을 연결하여 결합 할 수 있습니다.

grep "foo"\t"bar"

-4

입력 할 수 있습니다

grep \ t foo

또는

grep '\ t'foo

foo 파일에서 탭 문자를 검색합니다. \ n 만 테스트했지만 다른 이스케이프 코드를 수행 할 수도 있습니다. 시간이 많이 걸리고 왜 원하는지 명확하지 않지만 zsh에서는 탭 문자를 시작으로 돌아가서 grep하고 따옴표로 묶을 수도 있습니다.


-6

빈 공간을 여러 번 찾으십시오. [[: space :]] *

grep [[: space :]] * '.' '.'

다음과 같은 것을 찾을 것입니다 :

'탭'..

작은 따옴표 ( ')이며 큰 따옴표 ( ")가 아닙니다.
이것은 grep에서 연결하는 방법입니다. =-)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.