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

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

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

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

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

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

…输出:

  1. 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

而我想要的是:

  1. 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= ,将筛选器设置为仅在该位置匹配:

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

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

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

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

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

…可称为:

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

  1. filesForYear /e/f/g 2016

…等等。

通常只搜索文件名

考虑以下功能:

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

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

  1. grepHdfsList /a/b/c/d/e 2015
展开查看全部

相关问题