출력에서 특정 부분을 인쇄


11

다음과 같은 명령이 있다고 가정하자 :

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG

결과는 다음과 같습니다.

CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"

이제 내 질문은 : 거꾸로 쉼표 안에있는 것을 인쇄하는 명령이 " "있습니까?

명령을 조금 설명해 주시겠습니까? 감사합니다! 미리.


5
cat파이프에서의 사용 은 거의 항상 자원 낭비 (AKA UUOC )입니다. grep이미 파일에서 입력을 읽을 수 있습니다 (즉 grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic, 정확히 똑같은 일을하지만 1입니다. 더 짧습니다 2. 이해하기 쉽습니다 3. 추가 쉘과 프로세스를 포크하지 않습니다). 99 %의 경우 파이프를 시작할 때 여러 파일을 연결하지 않고 cat을 사용하면 위험합니다. :)
kos December

@kos-감사합니다! 내가 리눅스를 사용하기 시작한 것을 몰랐다. 명심하십시오.
Raphael

네! 나는이 질문에 걸려 넘어지는 다른 사람들을 위해 위의 의견을 남겼습니다.
kos

이 경우 초기 값 cat은 쓸모 없지만 나중에 무언가를 변경 / 추가 / 제거 tr하거나 a 또는 cut등의 파일 이름을 찾 거나 이동할 필요가없는 경우 향후 전체 명령 줄을 쉽게 편집 할 수 있습니다. , 다른 명령이 지원하는지 확인하고 어디에 넣을지 등을 찾으십시오. 작은 테스트 파일의 경우 0.002 만 추가합니다. (필자는 불필요하게 피하는 일생 동안 절약 할 수있는 것보다 이것을 입력하는 데 더 많은 시간을 보냈을 것입니다 cat)
Xen2050

1
@ Xen2050 왜 cat도움이 되나요? 당신은 grep foo file | tr또는 ... | cut쉽게 할 수 있습니다 cat file | tr | grep .... 은 cat단지 여분의 5 자, 여분의 파이프와 별도의 프로그램 호출을 추가하고 단순화 아무것도하지 않습니다.
terdon

답변:


15

네, 그렇게 할 수 있습니다. 당신의 명령은 다음과 같습니다.

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG | awk -F'"' '{print $2}'

다음 만 반환됩니다.

arch/x86/configs/x86_64_defconfig

awk명령은 명령과 함께 필드 구분 기호 -F를 사용하고 큰 따옴표를 사용하도록 설정하려면 다음과 같이 작은 따옴표를 사용하여 입력하십시오 -F'"'. 그런 다음 '{print $2}'awk는 필드 구분 기호 다음에 두 번째 세트를 인쇄 하도록 지시합니다.

도움이 되었기를 바랍니다!


14
@Terrance,이 경우에는 cat및 의 쓸모없는 사용입니다 grep. 당신은 대체 할 수 catgrep와 일부 awk -F'"' '/CONFIG_ARCH_DEFCONFIG/{print $2}' /boot/config-3.19.0-32-generic . 배관이 적어 AWK가 할 수있는 것 이상의 모든 작업을 할 수 있도록
Sergiy Kolodyazhnyy

@Serg와 동의
Tung Tran

@Serg 문제 없습니다. 당신이 무슨 말을하는지 이해합니다. 나는 명령을 추가하여 그의 원래 명령에만 추가하고있었습니다 awk. =)
Terrance

11

단일 grep명령으로 수행 할 수 있습니다 .

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-3.19.0-32-generic

또는 (약간 더 길고 더 경련이 나는) :

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-3.19.0-32-generic
  • -P: grep패턴을 PCRE (Perl Compatible Regular Expression)로 해석하도록 지시 합니다.
  • -o: grep일치 항목 만 인쇄하도록 지시 합니다.
  • ^CONFIG_ARCH_DEFCONFIG=": CONFIG_ARCH_DEFCONFIG="줄의 시작 부분에 있는 문자열 과 일치합니다 .
  • \K: 이전에 일치 한 부분 문자열을 버립니다.

#1:

  • [^"]*: "(반갑지 않은 ) 모든 문자와 일치합니다 .

# 2 :

  • .*?: 임의의 수의 문자와 느리게 일치합니다.
  • (?="): lookahead (무제한 주장, 어떤 문자와도 일치하지 않음); 다음 문자가이면 일치합니다 ".
% grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-4.2.0-16-generic
arch/x86/configs/x86_64_defconfig
% grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-4.2.0-16-generic
arch/x86/configs/x86_64_defconfig

나는 같은 결과를 얻기 위해 여러 가지 방법을 배우는 것을 좋아합니다. 좋은 대답입니다! =)
Terrance

10

이 고양이를 벗기는 방법은 여러 가지가 있습니다. sed방법은 다음과 같습니다.

sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.19.0-32-generic

여기서 우리는 라인을 일치시키고 원하는 부분, 즉 큰 따옴표 ( ([^"]+)) 안의 부분을 캡처 한 다음 전체 라인을 캡처 된 그룹 ( \1)으로 만 바꿉니다 .

예:

% sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.13.0-32-generic
arch/x86/configs/x86_64_defconfig

10

아니, 아니 perl?

grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic | 
    perl -pe 's/.*?"([^"]*).*/$1/'

perl것이다 -p의해 주어진 스크립트를 적용한 후 모든 라인을 RINT -e. 이 ( s/foo/bar/가)로 대체 foo됩니다 bar. 괄호 안의 패턴은 "캡처"하고라고도 할 수있다 $1, $2... $N$1에서 촬영 한 첫번째 패턴, $2등 최초의 견적 (때까지 모든 것을 찾을 것이다 정규 표현식 두 번째 .*?"), 다음 0 개 이상의 비 캡처 "문자를 ( [^"]*) 및 기타 모든 것. 모든 것이 캡처 된 패턴으로 대체됩니다.

패턴을 perl다음과 일치하게 둘 수도 있습니다 .

perl -ne 's/.*CONFIG_ARCH_DEFCONFIG="([^"]*).*/$1/ && print' /boot/config-3.19.0-32-generic

2
나는 당신이 어느 시점에 참여할 줄 알았습니다 : P +1
heemayl

그때 파이썬 코드를 생성 할 ..
Avinash 라즈에게

with open('/boot/config-3.19.0-32-generic') as f: for line in f: if line.startswith('CONFIG_ARCH_DEFCONFIG'): print line.split('"')[1]
Avinash Raj

@ AvinashRaj 좋은 물건,이 게시물을 게시주의? 정규식에도 게시했습니다.
Sergiy Kolodyazhnyy 2012 년

8

다음은 동일한 작업을 수행하는 grep및 의 조합입니다 cut.

$ grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic | cut -d"\"" -f2                                                
arch/x86/configs/x86_64_defconfig

설명:

  • grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic표준 grep 구문에서 행을 찾는 부분입니다 grep [OPTIONS] PATTERN [FILE...]. 출력은 다음 단계로 파이프를 통과합니다.
  • cut -d"\"" -f2. 이 부분은 잘라내 -d기를 사용 하여 특정 구분 기호 ( 플래그 로 지정)로 구분 된 텍스트를 잘라냅니다 . 쉘 cut이 쉘 자체에 입력하는 대신 명령 에 대한 옵션 중 하나로 큰 따옴표를 사용할 수 있도록 백 슬래시로 큰 따옴표를 이스케이프해야 합니다. 이제 cut출력 취급 grep로 구분으로 "세 개의 열로 분할을 CONFIG_ARCH_DEFCONFIG, arch/x86/configs/x86_64_defconfig그리고 빈 공간. 우리가 필요한 줄은 두 번째 열이므로 -f2플래그 를 사용해야 합니다.

3

나는 현재 python여기서 배우고 있기 때문에 정확히 사용하는 버전입니다.

#!/usr/bin/env python
import re

reg = re.compile('CONFIG_ARCH_DEFCONFIG')

with open("/boot/config-3.19.0-32-generic") as file :
   for line in file:
       if reg.match(line):
           print line.split('"')[1]

샘플 실행 :

DIR:/TECH-BOOKS
skolodya@ubuntu:$ ./extractString.py                                           
arch/x86/configs/x86_64_defconfig

DIR:/TECH-BOOKS
skolodya@ubuntu:$ cat ./extractString.py                                       
#!/usr/bin/env python
import re

reg = re.compile('CONFIG_ARCH_DEFCONFIG')

with open("/boot/config-3.19.0-32-generic") as file :
   for line in file:
       if reg.match(line):
           print line.split('"')[1]

들여 쓰기는 파이썬에서 매우 중요합니다 ..
Avinash Raj

1
당신은 단지 즉 내 사용 regexd에 갈 필요가 없습니다 line.startswith때문에 re.match보다 훨씬 느립니다startswith
Avinash 라즈
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.