在模式匹配“hdfs-ds-ls”输出时如何忽略时间戳?

mw3dktmi  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(368)

我在hdfs上存储了一些文件,这些文件的名称后面有一个日期后缀,不同于文件的修改日期,如下所示:

$hdfs dfs -ls /a/b/c/d/e/*
Found 5 items
drwxr-xr-x - xuser xuser 0 2015-05-01 13:59 /a/b/c/d/e/exp_dt=2016-01-05
drwxr-xr-x - xuser xuser 0 2017-10-10 15:42 /a/b/c/d/e/exp_dt=2015-05-01

我只想找到一个给定 exp_dt . 目前,努力如下:

inputDir=/a/b/c/d/e/                                                                                                       
countCmd='hdfs dfs -ls $inputDir | grep '\.2015$''
hduCmdOutput=`eval $countCmd`
echo $hduCmdOutput

…输出:

drwxr-xr-x - xuser xuser 0 2015-05-01 13:59 /a/b/c/d/e/exp_dt=2016-01-05 drwxr-xr-x - xuser xuser 0 2017-10-10 15:42 /a/b/c/d/e/exp_dt=2015-05-01

而我想要的是:

drwxr-xr-x - xuser xuser 0 2017-10-10 15:42 /a/b/c/d/e/exp_dt=2015-05-01

当我只想与文件名本身匹配时,如何防止文件的日期戳(修改时间)匹配?

b5buobof

b5buobof1#

符合你的特定模式

如果您只想在一年之后立即过滤 exp_dt= 或者 day_id= ,将筛选器设置为仅在该位置匹配:

hdfs dfs -ls '/a/b/c/d/e/*' | grep -Ee '(exp_dt|day_id)=2015-'

或者如果你想匹配 2015-??-?? 只有在一行的末尾,这可能看起来像:

hdfs dfs -ls '/a/b/c/d/e/*' | grep -Ee '2015-..-..$'

请注意,没有 eval 在这里。如果要存储此代码以多次运行它(使用可能更改的参数),请使用以下函数:

filesForYear() {
  local path=$1 year=$2
  hdfs dfs -ls "$path/*" | grep -Ee "(exp_dt|day_id)=$year"
}

…可称为:

filesForYear /a/b/c/d/e 2015

filesForYear /e/f/g 2016

…等等。

通常只搜索文件名

考虑以下功能:

grepHdfsList() {
  local path=$1 pattern=$2
  while read -r line; do
    read -r _ _ _ _ _ _ _ filename <<<"$line"
    [[ $filename =~ $pattern ]] && printf '%s\n' "$line"
  done < <(hdfs dfs -ls "$path")
}

对于从中读取的每行 hdfs dfs -ls ,它只提取文件名,只根据模式匹配文件名,但如果模式匹配,则打印整行(你可以改变 printf '%s\n' "$line"printf '%s\n' "$filename" 如果您只想打印文件名)。
调用可能如下所示:

grepHdfsList /a/b/c/d/e 2015

相关问题