линии печати awk с критериями - больше чем - PullRequest
0 голосов
/ 19 декабря 2018
cat file.txt |  awk  ' /queryId/; /stats_missing/; /memory/'

Приведенная выше команда дает следующие результаты:

queryId : 3440b6c90a6ccec1
  stats_missing : true
  memory : 500
queryId : d94bf4e4756e6342
  stats_missing : false
  memory : 200

Я хочу получать результаты только в том случае, если память> определенное число (например, 300). Таким образом, мой вывод будет производить только память: (число больше, чем300)

queryId : d94bf4e4756e6342
  stats_missing : false
  memory : 500

Пример исходных данных из файла file.txt

queryId : 794d12600c5b11ad:c79abeee00000000
statement : SELECT `e88172_FIRSTFORBS_103118`.`filedt` `e88172_FIRSTFORBS_103118`.`ssn` `e88172_FIRSTFORBS_103118`.`suff` `e88172_FIRSTFORBS_103118`.`ln_num` `e88172_FIRSTFORBS_103118`.`prog` `e88172_FIRSTFORBS_103118`.`dlqdys` `e88172_FIRSTFORBS_103118`.`status` `e88172_FIRSTFORBS_103118`.`currprin` `e88172_FIRSTFORBS_103118`.`origprin` `e88172_FIRSTFORBS_103118`.`rpmtbegdt` `e88172_FIRSTFORBS_103118`.`forbmos` `e88172_FIRSTFORBS_103118`.`owner` `e88172_FIRSTFORBS_103118`.`frstdsbdt` `e88172_FIRSTFORBS_103118`.`uniq_loan_id` `e88172_FIRSTFORBS_103118`.`fdr_acct_nbr` FROM `edw_sandbox`.`e88172_FIRSTFORBS_103118` `e88172_FIRSTFORBS_103118`  LIMIT 10000
queryType : QUERY
queryState : FINISHED
startTime : 2018-12-19T22:29:02.235Z
rowsProduced : null
attributes : {
  thread_cpu_time_percentage : 51
  thread_network_receive_wait_time : 34
  thread_cpu_time : 166
  hdfs_average_scan_range : 3.3535640666666668E7
  bytes_streamed : 3572722
  hdfs_bytes_read : 100606922
  query_status : OK
  hdfs_scanner_average_bytes_read_per_second : 1.358740106189443E9
  thread_network_receive_wait_time_percentage : 11
  oom : false
  planning_wait_time_percentage : 0
  admission_wait : 0
  connected_user : e88172
  stats_missing : false
  planning_wait_time : 9
  client_fetch_wait_time_percentage : 0
  session_type : HIVESERVER2
  memory : 629145600
  client_fetch_wait_time : 6
  file_formats :
  admission_result : Admitted immediately
  pool : root.default
  session_id : e3463e2b18af960e:56a
  stats_corrupt : false
  thread_total_time : 329
  thread_network_send_wait_time_percentage : 5
  impala_version : impalad version 2.10.0-cdh5.13.3 RELEASE (build 15a453e15865344e75ce0fc6c4c760696d50f626)
  network_address : 172.19.79.81:44886
  thread_storage_wait_time_percentage : 34
  thread_network_send_wait_time : 15
  thread_storage_wait_time : 112

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Конечно легко с Perl с многострочным регулярным выражением :

$ perl -0777 -lnE 'while (/^(queryId[\s\S]+?^\h*memory\h*:\h*)(\d+)/mg){ say "$1$2" if $2<300}' file
queryId : d94bf4e4756e6342
    stats_missing : false
    memory : 200

$ perl -0777 -lnE 'while (/^(queryId[\s\S]+?^\h*memory\h*:\h*)(\d+)/mg){ say "$1$2" if $2>300}' file
queryId : 3440b6c90a6ccec1
    stats_missing : true
    memory : 500
0 голосов
/ 19 декабря 2018

Существует множество способов сделать это в зависимости от структуры ваших входных данных.

Предполагая, что строки stats_missing и memory всегда будут присутствовать после queryId, вы можете сделать что-то вроде:

awk -F':' '/queryId/ {query=$0}
     /stats_missing/ {stats=$0}
     /memory/ {mem=$2}
     query && stats && mem>5000 {
        print query;print stats; print "memory: "mem; query=stats=mem="";}'

Это сохраняет строки, соответствующие query,stats_missing и значение memory, затем, когда все 3 заполняются И значение memory превышает 5000 (в этом примере), оно выводит их на печать.

Например,

$ cat mem.txt
queryId : 3440b6c90a6ccec1
  stats_missing : true
  memory : 493719877394422178
queryId : d94bf4e4756e6342
  stats_missing : false
  memory : 2214592512
queryId : 3440b6c90a6ccec1
  stats_missing : true
  memory : 4978
queryId : d94bf4e4756e6342
  stats_missing : false
  memory : 200


$ awk -F':' '/queryId/ {query=$2}
     /stats_missing/ {stats=$2}
     /memory/ {mem=$2}
     query && stats && mem>5000 {
        print "queryId:"query;print "stats_missing:"stats; print "memory:"mem; query=stats=mem="";}' mem.txt
queryId: 3440b6c90a6ccec1
stats_missing: true
memory: 493719877394422178
queryId: d94bf4e4756e6342
stats_missing: false
memory: 2214592512

Как уже упоминалось, это может вывести из строя, если эти две другие строки не всегда присутствуют перед следующим идентификатором запроса.

Если это не так, вам нужно будет что-то делать, например, отслеживать каждый раз, когда вы сталкиваетесь с новым queryId и затем сбрасывать переменные.Или сделайте что-нибудь, например, сохраните все данные queryId, stats_missing и памяти в массиве, основанном на последнем обнаруженном queryId, а затем напечатайте все в конце.Множество способов снять шкуру с этой кошки в зависимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...