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

时间:2018-06-20 20:19:50

标签: shell hadoop sh

我有存储在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

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

1 个答案:

答案 0 :(得分:1)

匹配您的特定模式

如果您只想过滤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
相关问题