타임 스탬프에서 첫 번째 콜론 ':'을 제거하는 방법?


10

나는 프로그래밍에 익숙하지 않다 !!

누구나 :타임 스탬프의 첫 번째 위치에서 를 제거하는 데 도움을 줄 수 있습니까?:29.06.2019 23:03:17

현재 아래에 표시된 것처럼 awk / cut 명령을 사용하여 시도하고 있습니다.

TDS="$(grep 'Logfile started' process.log |  awk '{print $3,$4}' | cut -d: -f2)"
echo "$TDS"


29.06.2019 23

그리고 출력은 내가 원하는 것이 아닙니다! 로 인쇄하고 싶습니다 29.06.2019 23:03:17.

답변:


14

첫 번째 문자를 자르려면 다음을 사용할 수도 있습니다 cut -c.

$ echo ":29.06.2019 23:03:17" | cut -c 2-
29.06.2019 23:03:17

11

사용하다

cut -d: -f2-

대신에

cut -d: -f2

두 번째 필드에서 줄 끝까지 모든 것을 얻으려면 :

TDS="$(grep 'Logfile started' process.log |  awk '{print $3,$4}' | cut -d: -f2-)"
echo "$TDS"

8

awk멋진 도구이므로 매우 복잡한 작업을 해결할 수 있습니다. 그러나 귀하의 질문에 대해서는 bash의 기본 기능을 고수합니다.

이 쉬운 Substing 제거를 위해 다음을 수행합니다.

zehe="Logfile started :29.06.2019 23:03:17"
echo "${zehe#*:}"

이것은 인쇄됩니다 :

29.06.2019 23:03:17

내가 당신의 입장에 있고 프로그래밍과 배쉬를 배우기 시작했을 때, 나는이 핸드북을 많이 배웠습니다.

ABS-고급 배쉬 스크립팅 안내서

문제에 대한 몇 가지 예와 흥미로운 정보는 여기 에서 찾을 수 있습니다 . '하위 문자열 제거'를 찾으십시오.


3
+1 이것! 질문에 "bash"라는 태그가 붙어 있기 때문에 외부 도구를로드하는 것보다 훨씬 빠른 문자열을 조작하는 bash의 뛰어난 기능을 선호하는 것으로 간주해야합니다.
rexkogitans

2
@rexkogitans 이미 파일을 파싱하기 위해 grep 또는 awk를 호출하고 있기 때문에 bash는 더 빠르지 않습니다. 실제로 파일을 파싱해야 할 때마다 bash가 느려집니다. 모든 쉘은 느리고 bash는 대부분보다 느립니다. 즉, 쉘의 문자열 조작 기능은 실제로 가장 좋은 방법이지만 종종 입력을 변수로 사용하는 경우에만 가능합니다.
terdon

8

sed해결책 은 다음과 같습니다 .

$ echo ':29.06.2019 23:03:17' | sed 's/^://'
29.06.2019 23:03:17

명령 sed 's/^://'이 수행하는 것은 각 줄 의 시작 부분에서 s콜론 문자 :^빈 문자열 로 대체 하는 것 //입니다.

여기 awk에 필드 구분 기호를로 변경하고 ^:위에서 설명한 두 번째 필드를 출력 하는 까다로운 솔루션이 있습니다 .

$ echo ':29.06.2019 23:03:17' | awk -F'^:' '{print $2}'
29.06.2019 23:03:17

이 작업은 grep( description )으로 도 수행 할 수 있습니다 . 아마도 이것이 대량의 데이터에 가장 빠른 솔루션 일 수 있습니다.

$ echo 'Logfile started :29.06.2019 23:03:17' | grep -Po '^Logfile started :\K.*'
29.06.2019 23:03:17

또는 다음 명령으로 파일을 직접 처리하십시오. 여기서 제한 사항 ^이 제거됩니다.

grep -Po 'Logfile started :\K.*' process.log

위의 내용은 sed그룹을 통해 달성 할 수도 있습니다 ()->\1.

sed -nr 's/^.*Logfile started :(.*)$/\1/p' process.log

식이 ^.*<something>.*$전체 줄과 일치하는 곳에 가 포함 <something>됩니다. 이 명령 s/old/new/은이 줄을 첫 번째 캡처 그룹의 내용으로 대체합니다 (괄호 안의 표현이 더 구체적 일 수 있음). 이 옵션 -r은 확장 정규식을 활성화합니다. 이 옵션 -n은 정상 출력을 억제 sed하고 마지막으로 명령 p이 일치 항목을 인쇄합니다.


나는 awk특별한 의미를 가진 문자가있는 다중 문자 FS를 가질 수 있다는 것을 결코 알지 못했습니다! 오늘 배운 것.
Floris

6

에서이 작업을 이미 처리하고 있으므로 awk전체 작업을 직접 수행 할 수도 있습니다.

$ echo "foo bar :29.06.2019 23:03:17" |  awk '{sub(/^:/,"",$3); print $3,$4}' 
29.06.2019 23:03:17

sub명령의 일반 형식은 다음 sub(/REGEX/, REPLACEMENT, TARGET)과 정규 표현식에 대한 모든 일치를 대체 할 REGEX문자열로 REPLACEMENT입력 문자열 TARGET. 여기서 우리는 세 번째 필드 ( ) 의 첫 번째 :( ^"시작"을 의미 $3)를 아무 것도 바꾸지 않습니다.

물론, awk에서 그렇게하고 있다면 awk에서 모든 것을 수행하고 단일 작업으로 모든 작업을 수행 할 수 있습니다.

$ echo "Logfile started :29.06.2019 23:03:17" | 
    awk '/Logfile started/{sub(/^:/,"",$3); print $3,$4}' 
29.06.2019 23:03:17

또는 귀하의 경우 :

TDS="$(awk '/Logfile started/{sub(/^:/,"",$3); print $3,$4}' process.log)"
echo "$TDS"

0

또 다른 배쉬 솔루션 :

$ echo "Logfile started :29.06.2019 23:03:17" | xargs bash -c 'echo "${2#*:} $3"'
29.06.2019 23:03:17
  • 중간 변수 할당 대신 파이프 라인을 사용합니다.
  • 명령은 (표준 입력) 명령의 위치 매개 변수 xargs로 변환 합니다.stdinbash
  • 교체 echo와 함께 tail -n1 /path/to/reportfile.txt.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.