파일 줄의 처음 n과 마지막 n 문자를 grep합니다.

파일 줄의 처음 n과 마지막 n 문자를 grep합니다.

다음과 같은 로그 파일이 있습니다.

Mar 23 08:20:23 New file got created in sec: 235
Mar 23 08:21:45 New file got created in sec: 127
Mar 23 08:22:34 New file got created in sec: 875
Mar 23 08:25:46 New file got created in sec: 322
Mar 23 08:26:12 New file got created in sec: 639

다음과 같은 출력이 필요합니다.

Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639

내가 할 수 있는 일은 줄의 첫 번째 부분이나 마지막 부분을 찾는 것뿐입니다. 그 둘을 합칠 수가 없어요. 입력에서 원하는 출력을 어떻게 얻을 수 있나요?

답변1

컷을 다음과 같이 사용할 수 있습니다.

주문하다:

cut --complement -c17-43 file1.txt

산출:

Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639

답변2

당신은 이런 일을 할 수 있습니다

awk '{print $1,$2,$3,":",$NF}' logfile

답변3

당신은 그것을 사용할 수 있습니다 sed:

sed -r "s/^(.{15} ?).*(.{5})$/\1\2/" logfile

제안된 대로 첫 번째 패턴을 제로 패딩되지 않을 수 있는 한 자리 날짜에 적용하고 .*중간 패턴을 사용하여 보다 유연하게 만들었습니다.

답변4

이건 어때:

sed -e 's/^\(.\{4\}\).*\(.\{4\}\)$/\1 \2/'

(I/O 리디렉션을 파악하거나 파일 이름 등을 제공할 수 있습니다. 자세한 호출 정보는 sed(1)를 참조하세요.)

여기서는 정확히 4자를 선택했는데 원하는 숫자로 대체할 수 있습니다. 첫 번째 문자와 마지막 문자 수가 다를 수도 있습니다.

sed -e 's/^\(.\{5\}\).*\(.\{2\}\)$/\1 \2/'

그러면 각 줄의 처음 5자와 마지막 2자가 반환됩니다. 이를 추가로 매개변수화하는 방법을 알아보도록 하겠습니다.

또한 나는 grep(1)(또는 그 변형 중 하나) 대신 sed(1)을 선택했습니다. 나는 이것이 아마도 당신이 원하는 것이 아닐 것이라는 것을 알고 있습니다. 왜냐하면 당신이 sed regex가 아니라 grep regex를 요청했기 때문입니다.

관련 정보