문제

DBGView 로그 파일에서 처음 두 열을 제거하려고합니다. 3 열에서 줄이 끝날 때까지 인쇄하는 예를 찾을 수없는 것 같습니다. 각 라인에는 가변 수의 열이 있습니다.

도움이 되었습니까?

해결책

... 또는 더 간단한 솔루션 : cut -f 3- INPUTFILE 올바른 구분 기자 (-d)를 추가하면 동일한 효과가 있습니다.

다른 팁

awk '{for(i=3;i<=NF;++i)print $i}' 
awk '{ print substr($0, index($0,$3)) }'

여기에서 찾은 솔루션 :
http://www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-179078/

조나단 페인버그대답은 각 필드를 별도의 라인에 인쇄합니다. 당신은 사용할 수 있습니다 printf 같은 선에서 출력 레코드를 재구성하려면 필드를 왼쪽으로 이동할 수도 있습니다.

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
awk '{$1=$2=$3=""}1' file

NB :이 방법은 "공백"을 1,2,3 필드로 남겨 두지 만 출력을보고 싶다면 문제가되지 않습니다.

awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

이것은 주어진 필드 nr., n 이전에 무엇을 잘라 내고, 필드 NR.N 및 원래 간격을 유지 관리하는 것을 포함하여 나머지 모든 라인을 인쇄합니다 (개혁하지 않음). 필드의 줄이 줄에 다른 곳에 나타나면 Daisaa의 대답에 문제가있는 경우에는 요약되지 않습니다.

함수 정의 :

fromField () { 
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}

다음과 같이 사용하십시오.

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost 

출력은 후행 공간을 포함하여 모든 것을 유지합니다

'/n'이 레코드 분리기 인 파일에 적합하므로 라인 안에 새로운 라인 숯이 없습니다. 다른 레코드 분리기와 함께 사용하려면 다음을 사용하십시오.

awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

예를 들어. 16 진수 NR을 사용하지 않는 한 거의 모든 파일과 잘 작동합니다. 1 라인 내부.

다음 선은 어떻습니까 :

awk '{$1=$2=$3=""; print}' file

@ghostdog74 제안을 기반으로합니다. 선을 걸러 내면 내 것이 더 잘 행동해야합니다.

awk '/^exim4-config/ {$1=""; print }' file

예를 들어 세 번째 후에도 같은 줄에 열을 인쇄하려면 다음을 사용할 수 있습니다.

awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'

예를 들어:

Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf

인쇄 할 것입니다 :

20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf

우리가 볼 수 있듯이, PaySlip은 공간이있는 경우에도 올바른 선으로 표시됩니다.

다음 AWK 명령은 각 라인의 마지막 n 필드를 인쇄하고 라인 끝에서 새로운 라인 문자를 인쇄합니다.

awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'

아래에서 /usr /bin 디렉토리의 내용을 나열한 다음 마지막 3 줄을 보유한 다음 awk를 사용하여 각 라인의 마지막 4 개의 열을 인쇄하는 예를 아래에서 찾으십시오.

$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root       14736 Jan 14  2014 bcomps
-rwxr-xr-x 1 root root       10480 Jan 14  2014 acyclic
-rwxr-xr-x 1 root root    35868448 May 22  2014 skype

$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps 
Jan 14 2014 acyclic 
May 22 2014 skype

글쎄, 당신은 정규 표현식을 사용하여 동일한 효과를 쉽게 달성 할 수 있습니다. 분리기가 공간이라고 가정하면 다음과 같습니다.

awk '{ sub(/[^ ]+ +[^ ]+ +/, ""); print }'

Perl 솔루션 :

perl -lane 'splice @F,0,2; print join " ",@F' file

이 명령 줄 옵션은 다음과 같습니다.

  • -n 입력 파일의 모든 줄 주위를 루프하고 모든 라인을 자동으로 인쇄하지 마십시오.

  • -l 처리하기 전에 최신 라인을 제거하고 나중에 다시 추가합니다.

  • -a AutoSplit 모드 - 입력 라인을 @F 배열로 분할합니다. 기본적으로 공백에서 분할됩니다

  • -e Perl 코드를 실행하십시오

splice @F,0,2 @F 배열에서 열 0과 1을 깨끗하게 제거합니다.

join " ",@F 각 요소 사이의 공간을 사용하여 @F 배열의 요소에 결합합니다.

입력 파일이 공간에 세워지지 않고 Comma 지분 인 경우 사용하십시오. -F, -lane


파이썬 솔루션 :

python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" < file

awk '{a=match($0, $3); print substr($0,a)}'

먼저 세 번째 열의 시작 위치를 찾습니다. Substr은 위치 (이 경우 A)에서 시작하여 라인 ($ 0)을 라인의 끝까지 인쇄합니다.

여기에서 조금 늦었지만 위의 어느 것도 효과가없는 것 같았습니다. printf를 사용하여 각각을 시도하십시오. 나는 마지막에 Newline을 갖지 않기로 결정했습니다.

awk '{for(i=3;i<=NF;++i) printf("%s ",  $i) }'
awk '{for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");}'

원본 파일에있는 것과 동일한 순서로 4 번째 필드에서 마지막 필드까지의 레코드를 인쇄합니다.

Bash에서는 위치 매개 변수와 함께 다음 구문을 사용할 수 있습니다.

while read -a cols; do echo ${cols[@]:2}; done < file.txt

더 알아보기: 위치 매개 변수 처리 Bash Hackers Wiki에서

처음 두 필드를 무시하고 해당 필드를 가릴 때 공간을 원하지 않는다면 (위의 답변과 같이) :

awk '{gsub($1" "$2" ",""); print;}' file
awk '{$1=$2=""}1' FILENAME | sed 's/\s\+//g'

처음 두 열이 지워집니다. sed 선행 공간을 제거합니다.

awk 열에서 필드라고하는 열에서는 NF가 핵심입니다.

모든 행 :

awk -F '<column separator>' '{print $(NF-2)}' <filename>

첫 번째 행 전용 :

awk -F '<column separator>' 'NR<=1{print $(NF-2)}' <filename>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top