如何将文件名作为字符串传递给awk来解析目标

时间:2015-06-20 22:59:29

标签: bash parsing awk ksh tcsh

TASK

我正在尝试将路径名/文件名传递给awk,以便利用其字段分隔符功能。我想解析一个路径名/文件名,看它是否在系统的用户目录中。示例路径:

绝对路径:

/home/students/username               # VALID
/home/staff/username                  # VALID
/home/students/username/anythingElse  # VALID
/home/staff/username/anythingElse     # VALID
/home/notAccountStorage/anythingElse  # INVALID

相对路径(例如,pwd / current是/ home / student / user / courseFiles):

../                                       # VALID /home/student/user
../otherDir                               # VALID /home/student/user/other
../.                                      # VALID /home/student/user
../..                                     # INVALID /home/student
../../otherDir                            # INVALID /home/student/otherDir

CODE

我的想法是检查字符串是否以' /'然后处理绝对路径,否则处理相对路径。

AWK代码:

awk -F="/" '    BEGIN { directoryAccentCount=0                                                                  \
                        isValid=$FALSE;                                                                         \
                }                                                                                               \
                {                                                                                               \
                        # If the string starts with a "/", path is absolute                                     \
                        if ( $0 ~ /^\// ) {                                                                     \
                                # If either Student/Staff && Number of Fields must be great than 2              \
                                if ( ($2 == "student" || $2 == "staff") && NF > 2 ) isValid=$TRUE               \
                        } else {                                                                                \
                        # Path is relative                                                                      \
                                for (i = 1; i <= NF; i++) {                                                     \
                                        # Count how many directories the User wants to ASCEND towards ROOT      \
                                        if ( $i ~ /\.\./ ) { directoryAccentCount++ }                           \
                                        # If the difference between the Number of Fields and                    \
                                        # the Accent Count is greater than 2, isValid=$TRUE                     \
                                        difference=(NF - $directoryAccentCount)                                 \
                                        if ( $difference > 2 ) isValid=$TRUE                                    \
                        }                                                                                       \
                }                                                                                               \
                END { print $0 ":" $isValid }' << HERE $providedPath
HERE

ERROR

我尝试过上述代码的变体,但是awk一直试图按照文件路径,打开文件并处理文件的文本。我想处理路径本身。

awk:致命:文件`noCopyDir1&#39;是一个目录

4 个答案:

答案 0 :(得分:1)

你的解决方案太复杂了。你可以在bash的一行内完成。可能有比我更短的解决方案:

[ -d "$(readlink -f $YOUR_PATH | awk -F/ '$2 == "home" && $3 != "" {print "/"$2"/"$3}')" ]

说明:

readlink -f $YOUR_PATH

将任何路径转换为绝对路径。

awk -F/ '$2 == "home" && $3 != "" {print "/"$2"/"$3}'

因为路径已经是绝对的,所以我可以直接提取前两个路径,但是将它限制在主文件夹下,它也在某个子文件夹下。

然后检查它是否是一个文件夹。

答案 1 :(得分:1)

恕我直言,你的问题并不清楚,但听起来你只是想检查一个文件中给出的路径是否存在。那将是:

while IFS= read -r path
do
    [[ -e "$path" ]] && echo "valid" || echo "invalid"
done < file

答案 2 :(得分:0)

您可以尝试使用代替。它可以使用CwdFile::stat模块轻松处理路径,例如:

perl -mCwd=realpath -MFile::stat -E '
    $p = realpath($ARGV[0]); 
    say $p =~ m{\A/home/} && stat($p) ? q|VALID| : q|INVALID|' 
'../../otherDir'

获取绝对路径,检查它是否为home目录并且存在。

答案 3 :(得分:0)

仅在相对路径的情况下确定目录上升/体面的简化逻辑。 awk脚本利用逐个循环遍历字段并在向根移动时返回负值,在远离根时返回正值。

 # Check that the distance from a User Directory
                set movingDistance = `echo $argPath | awk -F'/' 'BEGIN{                                 \
                        distanceMoved=0                                                                 \
                }                                                                                       \
                {                                                                                       \
                        for ( i=1; i<NF; i++ ) {                                                        \
                                if ( $i ~ /\.\./ ) {                                                    \
                                        distanceMoved--                                                 \
                                } else {                                                                \
                                        distanceMoved++                                                 \
                                }                                                                       \
                        }                                                                               \
                }                                                                                       \
                END {                                                                                   \
                        print distanceMoved                                                             \
                }'`

这是确定文件路径是在系统中的用户帐户之外前进还是保留在用户目录中的必要步骤,这就是我应用脚本的方式,但是,它可以在许多其他情况下使用。 / p>