如何从 bash 传递参数并在 awk 中进行字符串比较?

发布于 2024-12-09 18:50:35 字数 435 浏览 0 评论 0原文

如何将参数传递给 awk 以将字符串与管道输入进行比较? 例如,以下内容用于过滤特定文件夹下 2011 年 8 月之前创建的文件

#!/bin/bash
$FILTER_DIR=$1

# file date before it should be listed.
FILTER_BEFORE="2011-08"

# $6 in awk statement is date of file name($8)
find $1 -type f | \
    sed 's/^/ls -l /g' | \
    sh | \
    awk ' if ( $6 le $FILTER_BEFORE ) { print $8 }'

。结果列出 $FILER_DIR 下的所有文件,而不进行过滤。 看来 AWK 没有从 bash 正确接收 $FILTER_BEFORE 。 任何评论表示赞赏!

How to pass a parameter to awk to compare the string with pipe input?
For example, followings are used to filter files created before Aug 2011 under specific folder

#!/bin/bash
$FILTER_DIR=$1

# file date before it should be listed.
FILTER_BEFORE="2011-08"

# $6 in awk statement is date of file name($8)
find $1 -type f | \
    sed 's/^/ls -l /g' | \
    sh | \
    awk ' if ( $6 le $FILTER_BEFORE ) { print $8 }'

The result list all files under $FILER_DIR without filtering.
It seems AWK didnot receive $FILTER_BEFORE from bash properly.
Any comment is appreciated!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

咆哮 2024-12-16 18:50:35

如果使用 gawk,请将其作为参数传递

find $1 -type f | 
sed 's/^/ls -l /g' | 
sh | 
awk -v filter_before=${FILTER_BEFORE} '{ if ( $6 <= filter_before ) { print $8 } }'

if using gawk, pass it as a parameter

find $1 -type f | 
sed 's/^/ls -l /g' | 
sh | 
awk -v filter_before=${FILTER_BEFORE} '{ if ( $6 <= filter_before ) { print $8 } }'
中性美 2024-12-16 18:50:35

您将需要使用双引号并转义其他 AWK 变量,这样它们就不会被 bash 解释。

find $1 -type f | \
    sed 's/^/ls -l /g' | \
    sh | \
    awk " if ( \$6 le \"$FILTER_BEFORE\" ) { print \$8 }"

或者,您可以仅将变量放入双引号中,这样就可以避免转义。

find $1 -type f | \
    sed 's/^/ls -l /g' | \
    sh | \
    awk ' if ( $6 le "'"$FILTER_BEFORE"'" ) { print $8 }'

You will need to use double quotes and escape the other AWK variables so they don't get interpreted by bash.

find $1 -type f | \
    sed 's/^/ls -l /g' | \
    sh | \
    awk " if ( \$6 le \"$FILTER_BEFORE\" ) { print \$8 }"

Alternatively you can break out just the variable into double quotes so you can avoid escaping.

find $1 -type f | \
    sed 's/^/ls -l /g' | \
    sh | \
    awk ' if ( $6 le "'"$FILTER_BEFORE"'" ) { print $8 }'
沒落の蓅哖 2024-12-16 18:50:35

我会选择:

touch -t 201107302359 30_july_2011
find . -type f ! -newer 30_july_2011 

或者这个(仅GNU find):

find . -type f ! -newermt '2011-07-30 23:59' 

I'd go with:

touch -t 201107302359 30_july_2011
find . -type f ! -newer 30_july_2011 

Or this (GNU find only):

find . -type f ! -newermt '2011-07-30 23:59' 
孤城病女 2024-12-16 18:50:35

以下语句似乎工作正常。
感谢大家的帮助。

find $1 -type f | \ 
sed 's/^/ls -l /g' | \ 
sh | \ 
awk -v filter_before=${FILTER_BEFORE} '{ if ( $6 < filter_before ) { print $8 } }'

Following statements seem work properly.
Thanks for everybody's help.

find $1 -type f | \ 
sed 's/^/ls -l /g' | \ 
sh | \ 
awk -v filter_before=${FILTER_BEFORE} '{ if ( $6 < filter_before ) { print $8 } }'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文