使用shell脚本从配置单元查询的结果中查找字符串并提取值?

mwkjh3gx  于 2021-06-25  发布在  Hive
关注(0)|答案(2)|浏览(502)

问题类似于:使用bashshell脚本从文件中查找并提取特定字符串后的值?
我正在执行一个来自shell脚本的配置单元查询,需要在一个变量中提取一些值,查询如下:

  1. sql="show create table dev.emp"
  2. partition_col= `beeline -u $Beeline_URL -e $sql` | grep 'PARTITIONED BY' | cut -d "'" -f2`

sql查询的输出如下:

  1. +----------------------------------------------------+
  2. | createtab_stmt |
  3. +----------------------------------------------------+
  4. | CREATE EXTERNAL TABLE `dv.par_kst`( |
  5. | `col1` string, |
  6. | `col2` string, |
  7. | `col3` string) |
  8. | PARTITIONED BY ( |
  9. | `part_col1` int, |
  10. | `part_col2` int) |
  11. | ROW FORMAT SERDE |
  12. | 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' |
  13. | STORED AS INPUTFORMAT |
  14. | 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' |
  15. | OUTPUTFORMAT |
  16. | 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' |
  17. | LOCATION |
  18. | 'hdfs://nameservicets1/dv/hdfsdata/par_kst' |
  19. | TBLPROPERTIES ( |
  20. | 'spark.sql.create.version'='2.2 or prior', |
  21. | 'spark.sql.sources.schema.numPartCols'='2', |
  22. | 'spark.sql.sources.schema.numParts'='1', |
  23. | 'spark.sql.sources.schema.part.0'='{"type":"struct","fields":[{"name":"col1","type":"string","nullable":true,"metadata":{}},{"name":"col2","type":"string","nullable":true,"metadata":{}},{"name":"col3","type":"integer","nullable":true,"metadata":{}},{"name":"part_col2","type":"integer","nullable":true,"metadata":{}}]}', |
  24. | 'spark.sql.sources.schema.partCol.0'='part_col1', |
  25. | 'spark.sql.sources.schema.partCol.1'='part_col2', |
  26. | 'transient_lastDdlTime'='1587487456') |
  27. +----------------------------------------------------+

从上面的sql中,我想提取按细节划分的分区。

  1. Desired output :
  2. part_col1 , part_col2

尝试使用以下代码,但未获得正确的值:

  1. partition_col=`beeline -u $Beeline_URL -e $sql` | grep 'PARTITIONED BY' | cut -d "'" -f2`

而且这些分区方式不是固定的,这意味着对于其他文件,它可能包含3个或更多,所以我想提取所有分区方式。
所有值之间的分区和行格式serde,删除空格“`”和数据类型!

i7uaboj4

i7uaboj41#

你可以用 awk :

  1. /PARTITIONED BY \(/ {partitioned_by = 1; next}
  2. /ROW FORMAT SERDE/ {partitioned_by = 0; next}
  3. partitioned_by == 1 {a[n++] = substr($2, 2, length($2) - 2)}
  4. END { for (i in a) printf "%s, ", i}

将上述内容存储在名为 beeline.awk 执行时:

  1. partition_col=`beeline -u $Beeline_URL -e $sql` | awk -f beeline.awk
l2osamch

l2osamch2#

使用sed

  1. sed -n '/PARTITIONED BY/,/ROW FORMAT SERD/p' file.txt | sed '1d; $d' | sed -E 's/.*(`.*`).*/\1/g' | tr -d '`' | tr '\n' ','

演示:

  1. $sed -n '/PARTITIONED BY/,/ROW FORMAT SERD/p' file.txt | sed '1d; $d' | sed -E 's/.*(`.*`).*/\1/g' | tr -d '`' | tr '\n' ','
  2. part_col1,part_col2,$
  3. $

说明: sed -n '/PARTITIONED BY/,/ROW FORMAT SERD/p' <---打印两个图案之间的线条 sed '1d; $d' <--删除第一行和最后一行 sed -E 's/.*( .* ).*/\1/g' <--打印字符串``` tr -d ' '<--删除'``字符tr '\n' ','<--将新行替换为,`

相关问题