awk和bash脚本

时间:2009-12-03 09:05:21

标签: bash awk

我有一个包含版本文件version.txt的tgz文件。该文件只有一行“version = 1.0.0”。此tgz文件存在于两个不同的目录中,并且具有相同的名称。

我的要求是我需要使用bash脚本和awk来确定这两个tgz文件中哪一个是最新版本。即,具有1.0.0的tgz文件的版本低于具有版本1.0.1的文件。

2 个答案:

答案 0 :(得分:1)

使用tar -xzvf /mnt/cf/bundle.tgz -O version.txt提取版本。

棘手的部分是如何处理版本。如果你的版本总是三位数,那么我建议将每个部分乘以1000.这将为你提供一个可以轻松比较的大数字。即1.0.0 == 1000000000; 1.0.1 = 1000000001。另一个选项是使用%04d:0001.0000.0000和0001.0000.0001格式化每个零件。可以比较这些字符串。

答案 1 :(得分:1)

对于downvote和负面评论道歉,但我总是怀疑家庭作业类型的问题。为了弥补,我已经为你做了。你不需要awk,它可以用bash完成。

只需将F1和F2设置为正确的文件名即可。我将把它作为练习让你接受它们作为命令行参数:)

#!/usr/bin/env bash
F1=f1.tgz
F2=f2.tgz
VERSION_FILE=version.txt
version1=`tar -xzf $F1 -O $VERSION_FILE|sed -e 's/.*version=//'`
version2=`tar -xzf $F2 -O $VERSION_FILE|sed -e 's/.*version=//'`

if [ "$version1" == "$version2" ]; then
    echo "$F1 and $F2 contain the same version: $version1, $version2"
    exit 0;
fi

(   # start a subshell because we're changing IFS

    # Assume F1 is the latest file unless we find otherwise below
    latest_file=$F1
    latest_version=$version1

    # set the Internal Field Separator to a dot so we can
    # split the version strings into arrays
    IFS=.

    # make arrays of the version strings
    v1parts=( $version1 )
    v2parts=( $version2 )

    # loop over $v1parts, comparing to $v2parts
    # NOTE: this assumes the version strings have the same
    # number of components. If wont work for 1.1 and 1.1.1,
    # You'd have to have 1.1.0 and 1.1.1
    # You could always add extra '0' components to the shorter array, but
    # life's too short...
    for ((i = 0 ; i < ${#v1parts[@]} ; i++ )); do
        # NOTE: ${#v1parts[@]} is the length of the v1parts array
        if [ "${v1parts[i]}" -lt "${v2parts[i]}" ]; then
            latest_file=$F2
            latest_version=$version2
            break;
        fi
    done
    echo "$latest_file is newer, version $latest_version"
)