String 仅限grep文件的特定部分;在shell脚本中确定OS X系统版本

String 仅限grep文件的特定部分;在shell脚本中确定OS X系统版本,string,macos,bash,grep,applescript,perl,String,Macos,Bash,Grep,Applescript,Perl,要查找用户正在运行的OS X的当前版本,系统版本.plist文件将显示此信息。如何使用grep命令仅查找版本号并返回它 例如: cat /System/Library/CoreServices/SystemVersion.plist 将产生: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs

要查找用户正在运行的OS X的当前版本,系统版本.plist文件将显示此信息。如何使用
grep
命令仅查找版本号并返回它

例如:

cat /System/Library/CoreServices/SystemVersion.plist
将产生:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
 <dict>
    <key>ProductBuildVersion</key>
    <string>13A598</string>
    <key>ProductCopyright</key>
    <string>1983-2013 Apple Inc.</string>
    <key>ProductName</key>
    <string>Mac OS X</string>
    <key>ProductUserVisibleVersion</key>
    <string>10.9</string>
    <key>ProductVersion</key>
    <string>10.9</string>
</dict>
</plist>
这将返回:

    <string>10.9</string>
    <string>10.9</string>
10.9
10.9
第二个
10.9
来自
ProductUserVisibleVersion
键。我该如何操作grep命令,使其只搜索并从这里返回10.9?我知道我在示例中使用了我的
grep
专门查找10.9响应,但我想显示
之间出现的任何结果

我将把它合并到一个测试中,它希望返回可见的OSX版本,并用if/else命令检查它,然后相应地运行调用函数


我对
bash
脚本解决方案持开放态度,因为这样我还可以在其他选项中实现它。AppleScript作为另一种解决方案也应该知道。

我会使用
xml
解析器。这里有一个示例及其
XML::Twig
模块:

#!/usr/bin/env perl

use warnings;
use strict;
use XML::Twig;

XML::Twig->new(
    twig_handlers => {
        'plist/dict/string' => sub {
            my $prev = $_->prev_sibling('key');
            return unless defined $prev;
            if ( $prev->tag eq 'key' and 
                 $prev->text_only eq 'ProductUserVisibleVersion' ) {
                printf "%s\n", $_->text_only;
                exit 0;
            }   
        },  
    },  
)->parsefile( shift );
您可以像这样运行它:

perl script.pl /System/Library/CoreServices/SystemVersion.plist
这将产生:

10.9

我将使用
xml
解析器。这里有一个示例及其
XML::Twig
模块:

#!/usr/bin/env perl

use warnings;
use strict;
use XML::Twig;

XML::Twig->new(
    twig_handlers => {
        'plist/dict/string' => sub {
            my $prev = $_->prev_sibling('key');
            return unless defined $prev;
            if ( $prev->tag eq 'key' and 
                 $prev->text_only eq 'ProductUserVisibleVersion' ) {
                printf "%s\n", $_->text_only;
                exit 0;
            }   
        },  
    },  
)->parsefile( shift );
您可以像这样运行它:

perl script.pl /System/Library/CoreServices/SystemVersion.plist
这将产生:

10.9

以下内容不涉及与grep相关的一般问题,但简单地解决了您的具体问题:

/usr/libexec/PlistBuddy -c 'print :ProductUserVisibleVersion' /System/Library/CoreServices/SystemVersion.plist
基于AppleScript的备选解决方案:

osascript -e 'system version of (system info)'

以下内容不涉及与grep相关的一般问题,但简单地解决了您的具体问题:

/usr/libexec/PlistBuddy -c 'print :ProductUserVisibleVersion' /System/Library/CoreServices/SystemVersion.plist
基于AppleScript的备选解决方案:

osascript -e 'system version of (system info)'

苹果正在逐步将他们在OS X中的plist文件从XML转换为二进制格式,因此我建议使用一些既知道如何读取这两种格式的东西:要么使用
默认值
,要么使用
PLISTBUDY

$ defaults read /System/Library/CoreServices/SystemVersion ProductUserVisibleVersion
10.8.5
$ /usr/libexec/PlistBuddy -c "print :ProductUserVisibleVersion" /System/Library/CoreServices/SystemVersion.plist 
10.8.5

(很明显,我运行的是10.8.5,但同样的命令应该适用于10.9或10.7,或者…

苹果正在逐步将其OS X中的plist文件从XML格式转换为二进制格式,因此我建议使用懂得如何读取这两种格式的工具:要么
默认值
要么
PlistBuddy

$ defaults read /System/Library/CoreServices/SystemVersion ProductUserVisibleVersion
10.8.5
$ /usr/libexec/PlistBuddy -c "print :ProductUserVisibleVersion" /System/Library/CoreServices/SystemVersion.plist 
10.8.5

(很明显,我运行的是10.8.5,但是同样的命令应该适用于10.9或10.7,或者…)

我会使用grep和sed:

$ grep -e "<string>[0-9]+\.[0-9]+</string>" | sed -n -e 's/([0-9]+\.[0-9]+)/\1/p'
$grep-e“[0-9]+\[0-9]+”| sed-n-e的/([0-9]+\[0-9]+)/\1/p”

我还没有测试过,但有点类似

我会使用grep和sed:

$ grep -e "<string>[0-9]+\.[0-9]+</string>" | sed -n -e 's/([0-9]+\.[0-9]+)/\1/p'
$grep-e“[0-9]+\[0-9]+”| sed-n-e的/([0-9]+\[0-9]+)/\1/p”
我还没有测试过,但有点类似

简单的方法

awk '/ProductUserVisibleVersion/ {getline;print}' /System/Library/CoreServices/SystemVersion.plist
<string>10.9</string>
awk'/ProductUserVisibleVersion/{getline;print}'/System/Library/CoreServices/SystemVersion.plist
10.9
或者只是价值

awk -F"<|>" '/ProductUserVisibleVersion/ {getline;print $3}' /System/Library/CoreServices/SystemVersion.plist
10.9
awk-F”“/ProductUserVisibleVersion/{getline;print$3}'/System/Library/CoreServices/SystemVersion.plist
10.9
简单的方法

awk '/ProductUserVisibleVersion/ {getline;print}' /System/Library/CoreServices/SystemVersion.plist
<string>10.9</string>
awk'/ProductUserVisibleVersion/{getline;print}'/System/Library/CoreServices/SystemVersion.plist
10.9
或者只是价值

awk -F"<|>" '/ProductUserVisibleVersion/ {getline;print $3}' /System/Library/CoreServices/SystemVersion.plist
10.9
awk-F”“/ProductUserVisibleVersion/{getline;print$3}'/System/Library/CoreServices/SystemVersion.plist
10.9
100%外部Bash:

grep -A2  '<key>ProductUserVisibleVersion</key>' | grep '<string>' |cut -d\> -f2 |cut -d\< -f1
while read LINE
do
    if [ "$LINE" = "<key>ProductUserVisibleVersion</key>" ]
    then   
        read LINE
        LINE=${LINE#*>}
        echo ${LINE%<*}
        exit
    fi
done
grep-A2'ProductUserVisibleVersion'| grep'| cut-d\>-f2 | cut-d\<-f1
或100%内部Bash:

grep -A2  '<key>ProductUserVisibleVersion</key>' | grep '<string>' |cut -d\> -f2 |cut -d\< -f1
while read LINE
do
    if [ "$LINE" = "<key>ProductUserVisibleVersion</key>" ]
    then   
        read LINE
        LINE=${LINE#*>}
        echo ${LINE%<*}
        exit
    fi
done
读取行时
做
如果[“$LINE”=“ProductUserVisibleVersion”]
然后
读线
LINE=${LINE#*>}
echo${LINE%100%外部Bash:

grep -A2  '<key>ProductUserVisibleVersion</key>' | grep '<string>' |cut -d\> -f2 |cut -d\< -f1
while read LINE
do
    if [ "$LINE" = "<key>ProductUserVisibleVersion</key>" ]
    then   
        read LINE
        LINE=${LINE#*>}
        echo ${LINE%<*}
        exit
    fi
done
grep-A2'ProductUserVisibleVersion'| grep'| cut-d\>-f2 | cut-d\<-f1
或100%内部Bash:

grep -A2  '<key>ProductUserVisibleVersion</key>' | grep '<string>' |cut -d\> -f2 |cut -d\< -f1
while read LINE
do
    if [ "$LINE" = "<key>ProductUserVisibleVersion</key>" ]
    then   
        read LINE
        LINE=${LINE#*>}
        echo ${LINE%<*}
        exit
    fi
done
读取行时
做
如果[“$LINE”=“ProductUserVisibleVersion”]
然后
读线
LINE=${LINE#*>}

echo${LINE%@DigiMonk我使用AppleScript和bash的组合来完成某些任务。bash是我主要追求的东西,我先用“bash”和“grep”标记问题,然后再添加“AppleScript”。@DigiMonk我使用AppleScript和bash的组合来完成某些任务。bash是我主要追求的东西,我用“bash”和“grep”首先,我添加了“AppleScript”"后来。我从未使用过Perl,因为我不知道如何使用。我将把这个答案放在口袋里,以备将来我研究Perl时使用。谢谢。我从未使用过Perl,因为我不知道如何使用。我将把这个答案放在口袋里,以备将来我研究Perl时使用谢谢你。我之所以给你正确的答案,不是因为@DigiMonk说了什么,而是因为你已经成功地回答了问题和备选方案。我从问这个问题中得到了很多东西。谢谢,@DanijelJ(不过你还没有接受).由于答案现在提供了获取OS X版本和有用的通用解析技术的简单解决方案,您介意修改问题标题以反映这一点吗(或许可以在问题正文中添加一点前言)?我之所以给你正确的答案,不是因为@DigiMonk说了什么,而是因为你已经成功地回答了问题和备选方案。我从问这个问题中得到了很多东西谢谢@DanijelJ(不过你还没有接受).由于答案现在提供了获取OS X版本和有用的通用解析技术的简单解决方案,您介意修改问题标题以反映这一点吗(或许可以在问题正文中添加一点前言)?感谢您使用
sed
向我展示了一个示例。我自己尝试过这样做,但失败得很惨。我将能够保留此示例,并在未来的项目中在此基础上进行构建。感谢您使用
sed
向我展示了一个示例。我自己尝试过这样做,但失败得很惨。我将能够保留此示例,并在以后的项目中进一步完善它