我有存储在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
当我只想与文件名本身匹配时,如何防止文件的时间戳(修改时间)匹配?
答案 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