sed 명령을 사용하여 텍스트 파일의 첫 번째 열과 마지막 열만 표시하는 방법을 알아내는 데 도움이 필요합니다. 지금까지 내 첫 번째 열은 다음과 같습니다.
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
또한 |
출력에서 공백을 사용하는 대신 구분 기호를 유지하려는 경우 출력 필드 구분 기호를 지정할 수 있습니다. 불행하게도, 단지 flags 를 사용하는 것보다 조금 더 어색하지만 -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
입력에 현재 시스템에서 유효한 문자를 형성하지 않는 바이트 또는 바이트 시퀀스가 있는 경우에는 일반적으로 작동하지 않습니다. locale) 역할(예: 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