추출하려는 데이터 행이 포함된 파일이 있습니다. 나는 awk
이것이 완벽하다고 생각합니다 . 의사코드에서는 다음과 같은 작업을 수행한다고 상상합니다.
- 처리하려는 행과 일치하는 항목 찾기
awk
- 두 번째 부분에서는 내부적으로
{}
내 데이터와 일치하는 정규식을 찾습니다grep -o
. {}
아마도 끝이나 안쪽에 일치하는 항목을 인쇄하십시오.END
이걸 어떻게 해야할지 모르겠고 cut
올바르게 사용하고 있지 않다는 것도 알지만, 단지 의도를 좀 주기 위해 보여드리는 것뿐입니다. 도움을 받기를 바랍니다. 본질적으로 저는 다양한 정규식 일치 항목을 파악 $0
하고 추출하여 이를 자체 CSV 형식으로 통합할 수 있기를 원합니다.
내가 시도한 것은 다음과 같습니다.
➜ tmp cat data.txt
Concurrency Level: 1
Time taken for tests: 0.004 seconds
Complete requests: 1
Failed requests: 0
Total transferred: 838 bytes
HTML transferred: 632 bytes
Requests per second: 257.40 [#/sec] (mean)
Time per request: 3.885 [ms] (mean)
Time per request: 3.885 [ms] (mean, across all concurrent requests)
Transfer rate: 210.65 [Kbytes/sec] received
➜ tmp cat data.txt | awk '/Complete requests:/ {print;}'
Complete requests: 1
➜ tmp cat data.txt | awk '/Complete requests:/ {print $0;}'
Complete requests: 1
➜ tmp cat data.txt | awk '/Complete requests:/ {print;}'|cut -d: -f2
1
비슷한거 찾아봐야겠습니다.
Time taken for tests, 0.0004, s
Requests per second (mean), 257.40, #/sec
.
.
.
Transfer rate received, 210.65, Kbytes/sec
데이터가 매우 균일하지 않기 때문에 $0
각 일치 항목에 대해 별도의 "정규식 일치 후" 프로세스를 작성 해야 합니다 /Concurrency Level:/
.Time taken for tests:
답변1
awk
규칙-작업 쌍은 원하는 수만큼 가질 수 있습니다 . 특정 하위 필드의 순서를 변경하려는 것 같으므로 :
나중에 규칙별로 수행할 수 있는 배열로 따르는 모든 항목을 분할하는 전역 규칙이 필요할 수 있습니다.
예를 들어(여기서는 처음 두 개만 표시했습니다):
awk '
BEGIN {FS=":[ \t]+"; OFS=", "}
{split($2, a, /[ \t]+/)}
#
# now the case-by-case rule-action pairs
/Time taken/ {print $1, a[1], a[2]}
/Requests per second/ {print $1" "a[3], a[1], substr(a[2], 2, length(a[2])-2)}
' data.txt
Time taken for tests, 0.004, seconds
Requests per second (mean), 257.40, #/sec
답변2
또한 귀하에게 필요한 것이 무엇인지 잘 모르겠지만 그런 맥락에서 한 번에 완료할 것이라고 생각했습니다...
awk '/Time|Requests|Transfer/{print $0}' data.txt
이렇게 하면 일치하는 패턴을 로드하고 "|"를 사용할 수 있습니다. 따라서 /Time|Requests|Transfer/
"시간 일치, 요청 또는 전송"을 의미하고 해당 줄을 인쇄합니다.
답변3
사용TxR:
@(repeat)
@ (cases)
@param: @val [@units] (@rawdesc)
@ (or)
@param: @val [@units] @rawdesc
@ (or)
@param: @val [@units]
@ (bind rawdesc nil)
@ (or)
@param: @val @units (@rawdesc)
@ (or)
@param: @val @units @rawdesc
@ (or)
@param: @val @units
@ (bind rawdesc nil)
@ (or)
@param: @val
@ (bind units "")
@ (bind rawdesc nil)
@ (end)
@ (bind desc @(if rawdesc ` (@(regsub #/,/ "" rawdesc))` ""))
@ (output)
@param@desc, @val, @units
@ (end)
@(end)
달리기:
$ txr tocsv.txr data.txt
Concurrency Level, 1,
Time taken for tests, 0.004, seconds
Complete requests, 1,
Failed requests, 0,
Total transferred, 838, bytes
HTML transferred, 632, bytes
Requests per second (mean), 257.40, #/sec
Time per request (mean), 3.885, ms
Time per request (mean across all concurrent requests), 3.885, ms
Transfer rate (received), 210.65, Kbytes/sec
사례의 "사다리"로 인해 길어 보일 수 있지만 복사하여 붙여넣으면 쉽게 수행할 수 있습니다. 코드는 첫 번째 시도에서 원하는 결과를 생성하며 이해하기 쉽습니다. 찾고 있는 내용을 한 눈에 알 수 있습니다.
사건의 순서가 중요합니다. 상황이 경기로 시작되는 경우
@param: @val
먼저 넣으면 val
콜론과 공백 뒤의 전체 값이 소비됩니다.