sed의 LHS에서 date 명령에 인수 전달

sed의 LHS에서 date 명령에 인수 전달

날짜 문자열을 "2016년 1월 7일 12:12:12 EDT"(nessus 보고서에서)에서 간단히 2016-01-07로 변환해야 합니다. date 명령을 사용하여 sed(및 Python 및 awk)의 일치 논리와 sed 외부의 변환 논리를 해결했습니다. date "Jan 07, 2016 12:12:12 EDT" +%Y-%m-%d

이후 참조에서 참조할 수 있도록 일치 그룹을 사용하여 월, 일, 연도를 캡처합니다. sed가 일치하는 RHS의 매개 변수를 인식하도록 데이터 명령을 얻는 데 올바른 따옴표 조합을 찾을 수 없는 것 같습니다. 예를 들면 다음과 같습니다.

sed -E "s/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)(\s[0-9]{1,2}[,].[0-9]{1,4}.?[0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2}.\w{3})/`date -d "\1\2" "+%Y-%m-%d"`/g" 20170917.csv

따옴표를 사용하면 날짜가 첫 번째 인수를 무시하고 두 번째 인수를 기반으로 오늘 날짜를 인쇄하게 됩니다.

", ', 를 사용하여 역참조 \1 및 \2를 반복했지만 날짜 명령이 실행될 수 있도록 백틱 ``으로 묶으면 무시되는 것 같습니다 \".\'

입력은 Tenable Nessus 보고서의 csv입니다.

헤더tmp/20180121.csv

(1) "플러그인", "플러그인 이름", "시리즈", "심각도", "IP 주소", "프로토콜", "포트", "취약?", "리포지토리", "MAC 주소" , " DNS 이름","NetBIOS 이름","플러그인 텍스트","처음 발견","마지막 관찰","완화","익스플로잇 프레임워크"

(2) "73571","Oracle Java SE 다중 취약점(2014년 4월 CPU)(Unix)","기타","위험","10.140.162.132","TCP","0","예", " 개별 스캔","00:50:56:c0:00:01","host.example.com","","플러그인 출력: 다음과 같은 취약한 Java 인스턴스가 원격 호스트에 설치되어 있습니다.

경로: /opt/Geneious_linux64_7_1_9_with_jre/ 설치된 버전: 1.7.0_51 복구된 버전: 1.5.0_65 / 1.6.0_75 / 1.7.0_55 / 1.8.0_5","2018년 1월 21일 22:14:50 EST","1 3월 21일 , 2018년 22:14:50 EDT","",""

번호가 매겨진 각 줄은 레코드입니다. (1)은 헤더이고 (2)는 나머지를 나타냅니다.

변환할 날짜 문자열은 2행의 마지막 줄에 있습니다. 두 경우 모두 내가 필요한 것은 간단합니다: 2018-01-21.

답변1

일반적인 접근 방식은 번역 테이블을 추가하고 역참조를 사용하는 것입니다.

echo 'Jan 07, 2016 12:12:12 EDT' | sed -E '
  s/$/Jan01Feb02Mar03Apr04May05Jun06Jul07Aug08Sep09Oct10Nov11Dec12/
  s/^(...) (..), (....).*\1(..).*/\3-\2-\4/'

sed날짜를 변환하기 위해 실행하려면 명령 의 GNU 확장: 플래그 (GNU 확장 도 포함 ) date를 사용해야 합니다 .esdate-d

echo 'Jan 07, 2016 12:12:12 EDT' | sed -E '
  s/^([[:alpha:]]{3} [[:digit:]]{2}, [[:digit:]]{4}).*$/date -d "\1" +%F/e'

그러나 이는 date각 입력 줄에 대해 셸을 실행하는 것을 의미하며 이는 매우 비효율적입니다(그리고 sh가 입력을 기반으로 동적으로 생성된 코드를 해석하도록 허용하므로 해당 입력을 신뢰할 수 있는지 알 수 없기 때문에 위험합니다). perl당신이 안에 있고 싶지 않다면 sed.

관련 정보