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

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

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

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

sql查询的输出如下:

+----------------------------------------------------+
|                   createtab_stmt                   |
+----------------------------------------------------+
| CREATE EXTERNAL TABLE `dv.par_kst`(                |
|   `col1` string,                                   |
|   `col2` string,                                  |
|   `col3` string)                                  |
| PARTITIONED BY (                                   |
|   `part_col1` int,                                 |
|   `part_col2` int)                                 |
| ROW FORMAT SERDE                                   |
|   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'  |
| STORED AS INPUTFORMAT                              |
|   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'  |
| OUTPUTFORMAT                                       |
|   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' |
| LOCATION                                           |
|   'hdfs://nameservicets1/dv/hdfsdata/par_kst' |
| TBLPROPERTIES (                                    |
|   'spark.sql.create.version'='2.2 or prior',       |
|   'spark.sql.sources.schema.numPartCols'='2',      |
|   'spark.sql.sources.schema.numParts'='1',         |
|   '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":{}}]}',  |
|   'spark.sql.sources.schema.partCol.0'='part_col1', |
|   'spark.sql.sources.schema.partCol.1'='part_col2', |
|   'transient_lastDdlTime'='1587487456')            |
+----------------------------------------------------+

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

Desired output :

part_col1 , part_col2

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

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

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

i7uaboj4

i7uaboj41#

你可以用 awk :

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

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

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

l2osamch2#

使用sed

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

演示:

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

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

相关问题