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
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