在shell中使用awk sed sort 等命令替换多个参数

场景:

用shell脚本,从A文件的获取URL参数,覆盖B文件的URL

A文件内容

http://appldnld.apple.com/ios8.4.1/031-31019-20150812-75169310-3C8F-11E5-BAB2-9B1A3A53DB92/iPad4,8_8.4.1_12H321_Restore.ipsw
http://appldnld.apple.com/ios8.4.1/031-31157-20150812-7518D8FA-3C8F-11E5-B354-AD1A3A53DB92/iPad4,9_8.4.1_12H321_Restore.ipsw
http://appldnld.apple.com/ios8.4.1/031-31386-20150812-A4FC2602-3C90-11E5-B036-A21D3A53DB92/iPad5,3_8.4.1_12H321_Restore.ipsw
http://appldnld.apple.com/ios8.4.1/031-31164-20150812-7519C21A-3C8F-11E5-937E-AF1A3A53DB92/iPad5,4_8.4.1_12H321_Restore.ipsw
http://appldnld.apple.com/ios8.4.1/031-31129-20150812-751A3CB8-3C8F-11E5-A8A5-A91A3A53DB92/iPhone4,1_8.4.1_12H321_Restore.ipsw
http://appldnld.apple.com/ios8.4.1/031-31186-20150812-751D243C-3C8F-11E5-8E4F-B51A3A53DB92/iPhone5,1_8.4.1_12H321_Restore.ipsw
http://appldnld.apple.com/ios8.4.1/031-31065-20150812-7518F132-3C8F-11E5-A96A-A11A3A53DB92/iPhone5,2_8.4.1_12H321_Restore.ipsw
http://appldnld.apple.com/ios8.4.1/031-31126-20150812-751B1656-3C8F-11E5-8F6B-A71A3A53DB92/iPhone5,3_8.4.1_12H321_Restore.ipsw
http://appldnld.apple.com/ios8.4.1/031-30941-20150812-7516948C-3C8F-11E5-B90B-951A3A53DB92/iPhone5,4_8.4.1_12H321_Restore.ipsw
http://appldnld.apple.com/ios8.4.1/031-31174-20150812-75196C52-3C8F-11E5-8C71-B31A3A53DB92/iPhone6,1_8.4.1_12H321_Restore.ipsw
http://appldnld.apple.com/ios8.4.1/031-31002-20150812-7517E210-3C8F-11E5-A4C6-991A3A53DB92/iPhone6,2_8.4.1_12H321_Restore.ipsw

B文件内容

[iPhone6,2]
Name=iPhone 5S
Model=Global
Version=8.4.1
ProductIDs=33589600
URL=http://appldnld.apple.com/ios8.4.1/031-31002-20150812-7517E210-3C8F-11E5-A4C6-991A3A53DB92/iPhone6,2_8.4.1_12H321_Restore.ipsw

[iPhone5,1]
Name=iPhone 5
Model=GSM
Version=8.4.1
ProductIDs=35152
URL=http://appldnld.apple.com/ios8.4.1/031-31186-20150812-751D243C-3C8F-11E5-8E4F-B51A3A53DB92/iPhone5,1_8.4.1_12H321_Restore.ipsw

[iPhone5,2]
Name=iPhone 5
Model=Global
Version=8.4.1
ProductIDs=33589584
URL=http://appldnld.apple.com/ios8.4.1/031-31065-20150812-7518F132-3C8F-11E5-A96A-A11A3A53DB92/iPhone5,2_8.4.1_12H321_Restore.ipsw

方案:

看到两个文件中的URL都包含唯一的iOS设备名称。以它作为主键来匹配URL。用awk分别取出A,B文件的对应URL,用sed做替换。

步骤:

  1. 用awk 提取A,B文件中包含”iPhone5,1 “这个字符的URL
    awk 的用法很简单 awk ‘/匹配规则/ {print(跟C语言类似的格式化输出)} ’ + 数据源文件

awk '/iPhone5,1/ {printf("iPhone51_expect=%s", $1)}' A.txt

awk '/iPhone5,1/ && /ipsw/ {printf("iPhone51_target=%s", $1)}' B.txt
这里因为B文件iPhone5,1 会同时匹配出URL所在行的数据和设备名所在行的数据,所以增加一个/ipsw/的过滤,双重匹配

  1. 用sed替换

sed -i '' "s@$iPhone51_target@URL=$iPhone51_expect@g" B.txt
这里注意几点:

* 用@符合作为sed替换命令的分隔符
* 用 -i 命令将替换结果写入文件
* -i 之后的’’ 表示不生成备份文件,解决报错问题
  1. 等替换完成后,可以再使用awk命令将两个文件的URL数据都提取出来并排序。然后用diff命令验证数据是否一致

get iOSCfg ipsw list

cat B.txt | grep ipsw | grep 8.4.1 | sort -b -u | sort -k 1.93 | sed 's/<string>//g' | sed 's/</string>//g' | grep -v protected | sed 's/URL=http/http/g' > pc_ipsw_list.txt

get mac plist ipsw list

cat A.txt | sed 's/<string>http/http/g' | sed 's/</string>/ /g' | awk '/8.4.1/' |grep ipsw | sed 's/^[[:space:]]//' | sed 's/[ \t]$//g' | sort -k 1.93 > mac_ipsw_list.txt

diff mac_ipsw_list.txt pc_ipsw_list.txt

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • sed与awk实例 文本间隔 在每一行后面增加一空行 将原来的所有空行删除并在每一行后面增加一空行。这样在输出的文...
    stuha阅读 1,929评论 0 21
  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,291评论 2 25
  • netstat -tnlp|egrep -i "$1"|awk {'print $7'}|awk -F'/' '{...
    JerichoYu阅读 1,038评论 0 0
  • 1、Nginx日志分析日志格式:'$remote_addr - $remote_user [$time_local...
    运维前线阅读 773评论 0 4
  • 本文承接之前写的三十分钟学会AWK一文,在学习完AWK之后,趁热打铁又学习了一下SED,不得不说这两个工具真的堪称...
    mylxsw阅读 4,419评论 3 74