2016-07-04 5 views
2

행 분할 기준으로 awk를 사용하고 싶습니다. 선행 공백 및 후행 공백을 포함하는 공백 -F "[.]"를 사용하면 선행 및 후행 공백을 무시할 수 없습니다.AWK FS 다중 분리 기호에는 선행 공백 및 후행 공백 자르기가 포함됩니다.

echo "    IPv4 Input Packets............................1123330" | awk {print $1}` 

그러나

echo "    IPv4 Input Packets............................1123330" | awk -F"[. ]" {print $1} 

없음을 얻을 것이다 : 기본 FS는 선행 공백을 트리밍 때문에

예를 들어,이 명령은 IPv4을 얻을 것이다.

어떻게 print $1print $4를 사용하여 awkIPv41123330를 얻으려면?

답변

3

FS 패턴에 수량계 +을 사용할 수 있습니다. 첫 번째 필드가 비어있을 것 같은

s="    IPv4 Input Packets............................1123330" 

awk -F '[. ]+' '{print $2, $5}' <<< "$s" 

IPv4 1123330 

참고 해당 필드 번호는 2에서 시작됩니다.

동일한 출력을 얻으려면 print $2, $NF을 사용할 수도 있습니다. 당신은 수동으로 다음 후행 공백/선두를 벗기고해야

+0

빠른 답장을 보내 주셔서 감사합니다. 하지만 왜 $ 1은 비어 있습니까? IPv4를 얻기 위해 $ 1을 사용하고 1123330을 얻는 데 $ 4를 사용할 수있는 방법이 있습니까? – vinllen

+2

awk에서 비어 있지 않은'FS'를 사용할 때 왜 그런 행동이 올지 모르겠습니다. 'awk -F '[[: blank :]] +''$ 1'이 비어 있습니다. – anubhava

+1

@vinllen : 대신'$ 2'를 사용할 수 있다는 것을 알았습니까? 행운을 빕니다. – shellter

3

다시 일어날 필드 분할을 강제로 $0를 다시 할당합니다

$ echo "    IPv4 Input Packets............................1123330" | 
awk -F'[. ]+' '{sub(/^ +| +$/,""); $0=$0; print $1, $4}' 
IPv4 1123330 

을 모든이 스트립의 문자 FS 포함 할 경우

$ echo "    IPv4 Input Packets............................1123330" | 
awk -F'[. ]+' '{sub("^"FS"|"FS"$",""); $0=$0; print $1, $4}' 
IPv4 1123330