![파일에서 지정된 줄 읽기 - BASH](https://linux55.com/image/80308/%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EC%A7%80%EC%A0%95%EB%90%9C%20%EC%A4%84%20%EC%9D%BD%EA%B8%B0%20-%20BASH.png)
파일의 특정 줄을 읽고 싶습니다.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:50
및 0]
기타 관련 항목을 생략하고 싶습니다 .
내 목표는 오직체인 이름.
답변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 이전에 교체가 발생해야 합니다.sed
p
p
배너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
}
'