sed를 사용하여 파일에서 한 줄의 일부를 추출하십시오.


18

파일에서 한 줄의 한 부분을 읽고 싶습니다. 예를 들면 다음과 같습니다.

POP3_SERVER_NAME = 로컬 호스트

localhostsed를 사용하여 만 반환하고 싶습니다 .

이 텍스트는 세 번째 줄에 있습니다. 나는 이것을 추출하기 위해 이것을한다 :

sed -n '3p' installation.sh

localhost부품 만 어떻게 추출 합니까?

답변:


26

awk가 더 나은 도구 일 것입니다.

$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost

"POP3_SERVER_NAME"이 포함 된 행을 검색하십시오. 마지막 필드를 인쇄하십시오. 이것은 항상 3 행에있는 POP3_SERVER_NAME에 의존하지 않으며, 이는 아마도 좋은 일입니다.

$ awk '/POP3_SERVER_NAME/{print $NF}' test.dat
localhost

응용 프로그램에 따라 정규식을보다 엄격하게 만들어야 할 수도 있습니다. 예를 들어 POP3_SERVER_NAME으로 시작 하는 행만 일치 시키려고 할 수 있습니다.

$ awk '/^POP3_SERVER_NAME/{print $NF}' test.dat
localhost

sed를 사용하는 것은 조금 덜 직관적입니다. (감사합니다, 아이러니를 알고 있습니다.) 어디에서나 POP3_SERVER_NAME이 포함 된 줄을 지정하십시오. 행의 시작부터 "="다음의 선택적 공백까지 모든 텍스트를 빈 문자열로 바꿉니다. 그런 다음 인쇄하십시오.

sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat

2
awk명령은 훌륭하지만-주위에 공백이있는 경우에만 가능합니다 =. 작동하지 않습니다 POP3_SERVER_NAME=localhost.
Marcel Stör

2
@Marcel, awk에서 사용하는 구분 기호 를 공백을 사용하여 다른 것으로 변경할 수 있습니다 -F. 예를 들어 : -F "="사용 =당신이 언급 경우에 구분 기호로.
mattpr

7

바꾸기 p라인의 불필요한 부분을 제거하는 치환 명령을 사용합니다.

sed -n '3 s/^[^=]*= *//p' installation.sh

위치가 아닌 키워드로 줄을 일치시킬 수 있습니다.

sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh

6

설정 파일이있는 것 같습니다. 할 수있는 일은 Adam Siemeon / slm이 제안한 것과 유사합니다.

sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename

여기서 [^=]제외 모든 '='문자가 +하나 이상의 문자가 동일한 유형의 이러한 실제 다음을 말한다 =, \s탭을 포함하는 임의의 공백 ( \t새로운 라인 \n, \r\n및 일반 공간 '반면 *수단은 0 개 이상의 동일한 타입의 괄호는 2, ..., \ n 교체 자리, \는 \ 1로 일치하는 문자 순서를 배치 안에 무엇이 잡을 $줄의 끝을 의미한다이의 전형적인 교체 패턴을 다음과 같습니다. s/.../.../modifiers. 명령 줄 옵션 -r을 의미합니다 확장 정규 표현식 구문 (편의상) -n은 신속하게 요청하거나 요청하지 않는 한 아무것도 출력하지 않음을 의미합니다 p.

다음과 같이 g수정자를 사용하여 전체 검색을 수행 할 수 있습니다.

sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename  # note the space after \1

그래서 당신으로 구분 된 문자열을 얻을 ' '(수 \n, \t또는 당신이) 쉽게 처리 할 수 있습니다.

방정식 문자가 앞에 오는 값은 줄의 끝까지 확장되며 의미가 단순한 "값"에서 벗어나는 주석이나 기타 문자가 뒤에 오지 않는 경우 둘 다 유효합니다.


편집하다:

다른 사람의 게시물에 대해서는 아직 여기에 댓글을 달 수 없습니다. 행을 표시하려면 s시작 따옴표 문자 앞 이나 앞에 vim과 같이 행 번호를 전달하십시오 (3의 경우 ).

sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename

를보십시오 info sed. 예를 들어 3.2와 4.7이 특히 중요합니다.


5
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost

또는 파일에 내용이있는 경우 :

sed 's/.*= //' somefile.txt
localhost

좋아, 그러나 나는 내 파일에서 다음과 같이 읽었다 : sed -n '3p'installation.sh
Mercer

2
@Mercer-답변에 추가 한 업데이트를 확인하십시오.
slm

@Adam Siemion-고맙지 만 행 번호를 나타내는 방법은 무엇입니까?
Mercer

4

cut 명령을 사용하여 delimeter를 '='로 설정 한 후 다음과 같이 두 번째 필드를 인쇄 할 수 있습니다.

cut -d'=' -f2

3

파일을 고려할 때 여러 가지 방법이 있습니다 foobar.

검색 할 패턴을 지정하십시오.

PAT=POP3_SERVER_NAME

를 사용하여 추출 sed

sed -n "/$PAT/p" foobar | sed "s/$PAT = //"

또는 사용 sedcut

sed -n "/$PAT/p" foobar | cut -d' ' -f3

2

Linux / Unix의 장점은 일반적으로 무언가를 달성 할 수있는 여러 가지 방법이 있다는 것입니다. op의 경우 파일에서 POP 서버 이름을 추출하는 방법에는 적어도 네 가지가 있습니다.

  1. grep POP3_SERVER_NAME installation.sh | cut -d'=' -f2
  2. grep POP3_SERVER_NAME installation.sh | awk '{print $3}'
  3. grep POP3_SERVER_NAME installation.sh | sed 's/.*= //'
  4. sed -n 's/^.*POP3_SERVER_NAME = //p' installation.sh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.