파일에서 지정된 줄 읽기 - BASH

파일에서 지정된 줄 읽기 - BASH

파일의 특정 줄을 읽고 싶습니다.iptables. 나는 읽고 싶다:그리고공간.

파일테이블

 # Generated by iptables 04:13:50 2015
 *filter
 :INPUT ACCEPT [0:0]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [0:0]


-A INPUT -p tcp -m tcp --sport http --dport 1024: -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport https --dport 1024: -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport webcache --dport 1024: -m state --state ESTABLISHED -j ACCEPT
COMIT
# Completed on Mon Dec 04:13:50 2015

내 거산출그래야 합니다.

INPUT
FORWARD
OUTPUT

어떻게 해야 하나요? 생각하고 있는데 어떻게 해야 할지 모르겠습니다 sed.IFS

내가 얻는 결과는 다음과 같습니다.

13:50  
INPUT
0]
FORWARD
0]
OUTPUT
0]
13:50

실행 후:

grep -Po ':\K[^ ]*' file

13:500]기타 관련 항목을 생략하고 싶습니다 .

내 목표는 오직체인 이름.

답변1

다음을 사용하는 것이 좋습니다 grep.

grep -Po '^ *:\K[^ ]*' file

설명하다:

  • -P: Perl 호환 정규식을 사용합니다.
  • -o: 일치하는 부분만 인쇄
  • \K: 지금까지 일치된 모든 항목을 잘라냅니다.
  • [^ ]*: 공백을 제외한 모든 항목과 0번 이상 일치합니다.

산출:

INPUT
FORWARD
OUTPUT

답변2

다른 sed:

sed -ne's/^:\([[:upper:]]*\).* $/\1/p' <in >out

s///이 명령은 입력 행당 하나의 교체를 시도합니다. 성공하지 않으면 아무것도 출력되지 않습니다 -n. p그래서/regexp/행과 일치해야 하며, s///유일한 rint 명령은 다음과 같으므로 rint 이전에 교체가 발생해야 합니다.sedpp배너s///대체 진술 에 관해서 .

입력 줄을 일치시키려면 먼저 :줄 시작 부분에 콜론을 일치시키고, 그 뒤에 0개 이상의 대문자 및 소문자 알파벳 문자, 그 다음 0개 이상의 다른 유형의 문자, 그리고 마지막으로 최소한 줄 끝에 일치해야 합니다. . 우주.^*[[:upper:]]*.$

일치하면 [[:upper:]]하위 그룹에서 참조되는 -char 시퀀스가 ​​.\(\)\1

그러나 예제가 공백으로 시작하고 공백으로 끝나기 때문에 예제 입력에서는 작동하지 않습니다. 귀하의 예에 대한 정규 표현식은 다음과 같습니다.

sed -ne's/^ *:\([[:upper:]]*\).*/\1/p'

대부분 동일하지만 줄 끝에서 일정한 수의 공백을 찾는 대신 머리 부분에서 임의의 수의 공백을 찾습니다.


INPUT
FORWARD
OUTPUT

답변3

이렇게 하려면 다음을 수행하십시오 sed.

sed -n '             # -n do not print lines to output by default
    /^:.* $/ {       # address lines beginning with colon, ending with space
        s/^://       # remove colon at beginning of line
        s/ .*//      # remove first space and everything following
        p            # print the edited line
    }
'

관련 정보