Bash awk和sed新手,我如何改进?多个sed和awk命令

Bash awk和sed新手,我如何改进?多个sed和awk命令,bash,sed,awk,xxd,Bash,Sed,Awk,Xxd,这是我构建的脚本 它根据作为参数提供的扩展名获取文件列表 然后删除这些文件中模式00000000:之前的所有内容 模式00000000:前面是字符串,然后它会删除前五个字符 if [[ $# -eq 0 ]] ; then echo 'Run script as ./hexconv ext' exit 0 fi for file in *.$1 do filename=$(basename $file)

这是我构建的脚本

  • 它根据作为参数提供的扩展名获取文件列表

  • 然后删除这些文件中模式00000000:之前的所有内容

  • 模式00000000:前面是字符串
    ,然后它会删除前五个字符
  • if [[ $# -eq 0 ]] ; then echo 'Run script as ./hexconv ext' exit 0 fi for file in *.$1 do filename=$(basename $file) extension="${filename##*.}" filename="${filename%.*}" sed -n '/00000000:/,$p' $file | sed '1s/^.....//' | head -n -3 | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "$10" "$11" "$12" "$13" "$14" "$15" "$16" "$17}' | xxd -p -r > $filename.jpg done
  • 然后,脚本将删除文件的最后三行
  • 脚本只输出文件的hextump数据
  • 脚本运行xxd将hextump转换为file.jpg
如果[$#-eq 0]];然后 echo“作为/hexconv ext运行脚本” 出口0 fi 对于*$1中的文件 做 filename=$(basename$文件) extension=“${filename##*.}” filename=“${filename%.*}” sed-n'/00000000:/,$p'$file | sed'1s/^…/“| head-n-3 | awk”{打印$2“$3”$4“$5”$6“$7”$8“$9”$10“$11”$12“$13”$14“$15“$16”$17}”| xxd-p-r>$filename.jpg 完成 它也可以按照我的要求工作,但我怀疑有一些东西可以改进它,但是唉,我是awk和sed的新手

摘自文件

sed -n -e 's/^<pre>//' -e '/00000000:/,$p'
响应头:
HTTP/1.1200ok
日期:2013年12月15日星期日04:27:04 GMT
服务器:PWS/8.0.18
X-Px:ms h0-s34.p6-lhr(h0-s35.p6-lhr),ht-d h0-s35.p6-lhr.cdngp.net
Etag:“4556354-9fbf8-4e40387aadfc0”
缓存控制:无存储,无缓存,必须重新验证,后检查=0,预检查=0,最大年龄=0
接受范围:字节
内容长度:654328
内容类型:图像/jpeg
最后修改时间:2013年8月15日星期四格林威治标准时间21:55:19
Pragma:没有缓存

00000000:ff d8 ff E000 10 4a 46 49 46 00 01 01 00 48…JFIF…H 00000010:00 48 00 00 ff e1 00 18 45 78 69 66 00 49.H…出口…二 00000020:2a 00 08 00 00 00 ff ed*。。。。。。。。。。。。。。。 00000030:004850687473687020332000.hphotoshop3.0。 000000 40:38 42 49 4d 04 04 00 00 1c 01 5a 00 8BIM………Z。 00000050:03 1b 25 47 1c 02 00 00 02 00 38 42 49 4d..%G...8BIM 00000060:04 25 00 00 10 fc e1 89 c8 b7 c9 78%……..x 00000070:34 62 34 07 58 77 eb ff e1 03 a5 68 74 70/4b4.Xw…..http 00000080:3a 6e 73 2e 61 64 62 65 2e 63 6d://ns.adobe.com/ 00000090:78 61 70 31 2e 30 00 3c 78 70 61 63 6b xap/1.0/?xpack 000000 A0:65 74 20 62 65 67 69 6e 3d 22 ef bb bf 22 20 69 et begin=“…”i 000000 B0:64 3d 22 57 35 4d 30 4d 70 43 65 68 48 7a 72 d=“W5MPCEHZR 000000 C0:65 53 7a 4e 54 63 7a 6b 63 39 64 22 3e 20 3c eSzNTczkc9d“? 000000d0:78 3a 78 6d 70 6d 65 74 61 20 78 6d 6c 6e 73 3a x:xmpmeta xmlns: 000000 e0:78 3d 22 61 64 62 65 3a 6e 73 3a 6d 65 74 61 x=“adobe:ns:meta 000000 F0:22 20 78 3a 78 6d 70 74 6b 3d 22 41 64 62/“x:xmptk=“Adob 00000100:65 20 58 4d 50 20 43 72 65 20 35 2e 30 2d 63 e XMP核心5.0-c 00000110:30 36 31 20 36 34 2e 31 34 39 39 2c 20 32 061 64.140949,2 00000120:30 31 30 32 37 2d 31 30 3a 35 37 3a 010/12/07-10:57:

虽然这是正确的,这可能属于你,但还是给你:

  • 将多个
    sed
    命令组合到一个命令中稍微更有效,例如:

        basename=$(basename "$file")
    
  • 最后一个
    awk
    作为一个循环可以更短,更不容易出错:

        extension=${basename##*.}
    

    …|awk'{printf$2;for(i=3;i错误消息应发送到stderr,不应硬编码脚本名称,以防以后重命名,并应以非零值退出

        root=${basename%.*}
    
    如果要将
    然后
    放在与
    如果
    相同的行上,则应将
    执行
    放在与
    for
    相同的行上,以确保一致性:

        sed -n '/0\{8\}:/,$p' "$file" | 
          head -n -3 | 
          awk '{ printf "%s", $2; for (f=3;f<=17;++f) { printf " %s", $f }; print "" }' | 
          xxd -p -r > "$root.jpg"
    done
    
    使用
    文件
    作为全名,使用
    文件名
    作为基本名称,这会使变量名称选择混乱。我会使用
    基本名称
    作为变量,以匹配操作。您需要引用参数展开:

    但您不需要引用作业的右侧:

    没有扩展名的文件名部分有时称为
    (在vi和csh
    -修饰符中,使用
    :r
    )使用该名称比更改现有变量并重用它更容易混淆:

    至于实际的管道,我会对其重新排序,将
    head
    放在
    awk
    之前,因为
    sed
    head
    都是关于要打印哪些行,并且应该在修改这些选定行的
    awk
    之前分组。我还会使用循环和
    printf
    来使
    awk
    更加灵活:

    sed-n'/0\{8\}:/,$p'$file“|
    头部-n-3|
    
    awk'{printf“%s”,$2;for(f=3;f这是一个代码检查问题,而不是一个特定的问题。它不属于堆栈溢出,但可能适合。sed-n-e's/^/'-e'/00000000:/,$p'如果在文件末尾至少出现第二次,则不正确。唯一的方法(在1 sed中)如果使用了缓冲区,删除3个拖车行也是可能的避免尾部-3和提取列也不容易在SED中进行转换。你是对的,一般来说这是不正确的,但在这种特定情况下它会起作用:他不会有另一个
    ,如果他无论如何,我划掉了那一点(见我的更新),因为它有点不可靠。
    for file in *.$1; do
    
        basename=$(basename "$file")
    
        extension=${basename##*.}
    
        root=${basename%.*}
    
        sed -n '/0\{8\}:/,$p' "$file" | 
          head -n -3 | 
          awk '{ printf "%s", $2; for (f=3;f<=17;++f) { printf " %s", $f }; print "" }' | 
          xxd -p -r > "$root.jpg"
    done