
sed 명령을 사용하여 텍스트 파일의 첫 번째 열과 마지막 열만 표시하는 방법을 알아내려면 도움이 필요합니다. 컬럼 1에 대해 지금까지 얻은 내용은 다음과 같습니다.
cat logfile | sed 's/\|/ /'|awk '{print $1}'
마지막 열도 표시하려는 나의 미약한 시도는 다음과 같습니다.
cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}'
그러나 이는 첫 번째 열과 마지막 열을 가져와 하나의 목록으로 병합합니다. sed 및 awk 명령을 사용하여 첫 번째 열과 마지막 열을 명확하게 인쇄하는 방법이 있습니까?
샘플 입력:
foo|dog|cat|mouse|lion|ox|tiger|bar
답변1
거의 다 왔어. 두 열 참조를 서로 옆에 놓으십시오.
cat logfile | sed 's/|/ /' | awk '{print $1, $8}'
또한 여기서는 필요하지 않습니다 cat
.
sed 's/|/ /' logfile | awk '{print $1, $8}'
awk
또한 열 구분 기호가 |
공백 대신 이므로 둘 중 하나도 필요하지 않다는 것을 알 수 있습니다 sed
.
awk -F '|' '{print $1, $8}' logfile
에 따라제안~에 의해갈렙, 정확히 8개가 아니더라도 마지막 필드를 출력하는 솔루션을 원하는 경우 를 사용할 수 있습니다 $NF
.
awk -F '|' '{print $1, $NF}' logfile
또한 출력에서 구분 기호를 유지하려면 |
공백을 사용하는 대신 출력 필드 구분 기호를 지정할 수 있습니다. 불행히도 플래그를 사용하는 것보다 조금 더 어색 -F
하지만 여기에 세 가지 접근 방식이 있습니다.
awk
BEGIN 블록에서 입력 및 출력 필드 구분 기호를 자체적으로 할당할 수 있습니다 .awk 'BEGIN {FS = OFS = "|"} {print $1, $8}' logfile
awk
명령줄에서 호출할 때 플래그를 통해 이러한 변수를 할당할 수 있습니다-v
.awk -v 'FS=|' -v 'OFS=|' '{print $1, $8}' logfile
또는 간단하게:
awk -F '|' '{print $1 "|" $8}' logfile
답변2
awk
어쨌든 사용하고 있습니다 :
awk '{ print $1, $NF }' file
답변3
처음부터 끝까지 (또는 원하는 경우 공백) |
로 바꾸십시오.|
sed 's/|.*|/|/'
sed
특별한 구현 은 없지만 |
(펼친정규 표현식은 일부 구현을 통해 활성화되지 않습니다 -E
. -r
그 \|
자체는 GNU 와 같은 일부에서는 특별합니다 sed
. 그래서 당신은해야~ 아니다|
문자 와 일치시키려는 경우 탈출하십시오 |
.
공백으로 바꾸고 입력에 이미 하나만 있는 줄이 포함되어 있는 경우 해당 줄과 일치하지 않는 |
것으로 특별히 처리해야 합니다 . |.*|
그것은 다음과 같을 수 있습니다:
sed 's/|\(.*|\)\{0,1\}/ /'
(즉, 해당 .*|
부분을 선택적으로 만듭니다) 또는:
sed 's/|.*|/ /;s/|/ /'
또는:
sed 's/\([^|]*\).*|/\1 /'
입력의 필드 수에 관계없이 첫 번째 및 여덟 번째 필드를 원하는 경우 다음과 같습니다.
cut -d'|' -f1,8
(모든 항목은 입력이 유효한 텍스트를 형성한다고 가정하는 모든 POSIX 호환 유틸리티에서 작동합니다. 특히 입력 에 sed
현재 로케일에서 유효한 문자를 형성하지 않는 바이트 또는 바이트 시퀀스가 있는 경우 일반적으로 작동하지 않습니다. printf 'unix|St\351phane|Chazelas\n' | sed 's/|.*|/|/'
UTF-8 로캘)).
답변4
로 구분된 텍스트의 첫 번째 필드와 마지막 필드를 가져오려는 것 같습니다 |
.
귀하의 로그 파일에 아래와 같은 텍스트가 포함되어 있다고 가정합니다.
foo|dog|cat|mouse|lion|ox|tiger|bar
bar|dog|cat|mouse|lion|ox|tiger|foo
그리고 당신은 다음과 같은 출력을 원합니다.
foo bar
bar foo
그렇다면 여기에 귀하의 명령이 제공됩니다.
GNU sed를 통해,
sed -r 's~^([^|]*).*\|(.*)$~\1 \2~' file
예:
$ echo 'foo|dog|cat|mouse|lion|ox|tiger|bar' | sed -r 's~^([^|]*).*\|(.*)$~\1 \2~'
foo bar