带有标准的awk打印行-大于

时间:2018-12-19 20:39:09

标签: awk

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 :(得分:1)

有多种方法可以执行此操作,具体取决于输入数据的结构。

假设stats_missing之后总是出现memoryqueryId行,您可以执行以下操作:

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="";}'

这将存储与querystats_missingmemory值匹配的行,然后在填充所有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

但是,如前所述,如果其他两行并不总是出现在下一个查询ID之前,则可以完全摆脱困境。

如果不是这种情况,则必须执行类似跟踪每次遇到新的queryId的操作,然后重置变量。或者执行类似的操作,根据遇到的最后一个queryId将所有queryId,stats_missing和内存数据存储在数组中,然后在最后打印所有内容。有很多方法可以给这只猫剥皮。

答案 1 :(得分:0)

使用多行regexPerl可以轻松实现:

$ 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