免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2683 | 回复: 14
打印 上一主题 下一主题

sed问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-21 23:39 |只看该作者 |倒序浏览
今天在写一个脚本时遇到了几个问题,在这里请高手指点,谢谢!
1. 在命令行里运行以下命令可以,为什么在脚本里面不可以呢?
  #echo "/usr/local/bin/test" | sed 's/\//\\\//g'
就是想把所有的"/"转为"\/".

2. 有两个文件,比如说test-1.txt和test-2.txt,里面的内容大概如下(格式一样):前面是文件的md5值,后面是它的绝对路径,用以下命令产生的
  #find /usr -type f -name "*" -print0 | xargs -0 md5sum > test-1.txt
  
ac254d5e55f6563333664646446458784      /usr/local/bin/hello
23451549789463331664646446124646       /usr/local/bin/test
23451549789463331664646446146464       /usr/local/bin/empho
23451549789463331664646446146782       /usr/include/stdlib.h
23451549789463331664646446156911       /usr/include/linux/sched.h
23451549789463331664646446012450       /usr/local/include/stdlib.h
23451549789463331664646446058413       /usr/etc/rcS

想知道怎么可以知道这两个文件里对应的每个文件的md5是不是都一样?而且怎样效率最高?

3. 在对于问题2里面的所有文件的md5值进行求和时(用awk),发现它益出了,又没有什么办法可以去掉它的进位,让结果一直都是32个数字,或者能否对这些数字进行位运算?

谢谢!

论坛徽章:
0
2 [报告]
发表于 2009-04-21 23:43 |只看该作者

回复 #1 volunteer01 的帖子

[root@]# sed 's#/#\\/#g' 1
ac254d5e55f6563333664646446458784      \/usr\/local\/bin\/hello
23451549789463331664646446124646       \/usr\/local\/bin\/test
23451549789463331664646446146464       \/usr\/local\/bin\/empho
23451549789463331664646446146782       \/usr\/include\/stdlib.h
23451549789463331664646446156911       \/usr\/include\/linux\/sched.h
23451549789463331664646446012450       \/usr\/local\/include\/stdlib.h
23451549789463331664646446058413       \/usr\/etc\/rcS

md5sum值也可能有字母,怎么可能求和

论坛徽章:
0
3 [报告]
发表于 2009-04-21 23:48 |只看该作者

回复 #2 wtuter 的帖子

1. 又没有试过把命令写到一个脚本里看看行不行呢?
2. 我把它加起来,可以加,但对不对就不知道了,运行命令时没有报错。

论坛徽章:
0
4 [报告]
发表于 2009-04-21 23:59 |只看该作者

回复 #3 volunteer01 的帖子

无语了, sed 's#/#\\/#g' 1 在这里能运行,加到脚本就不能运行了吗?

ac254d5e55f6563333664646446458784      \/usr\/local\/bin\/hello


这个就不是数字,你加给我们看一下

论坛徽章:
0
5 [报告]
发表于 2009-04-22 00:19 |只看该作者

回复 #4 wtuter 的帖子

只是简单的把这句写到脚本也可以执行,但按照下面的写法就不行了,不知道什么原因

checksum_file=md5sum.txt
while read line
do
     i=`echo $line | sed 's#/#\\/#g'`
done < $checksum_file


#awk script file, named, say sum
BEGIN
{
      total=0
}

{
       total += $1
}

END{
       print total
}


#awk -f sum md5sum.txt

论坛徽章:
0
6 [报告]
发表于 2009-04-22 00:20 |只看该作者

回复 #1 volunteer01 的帖子

问题2,打印不一致的文件名
awk 'NR==FNR{a[$2]=$1};NR!=FNR{if(a[$2]!=""&&a[$2]!=$1){print $2}}' test1.txt test2.txt

论坛徽章:
0
7 [报告]
发表于 2009-04-22 00:27 |只看该作者

回复 #5 volunteer01 的帖子

checksum_file=md5sum.txt
while read line
do
     i=`echo $line | sed 's#/#\\/#g'`
done < $checksum_file


#awk script file, named, say sum
BEGIN
{
      total=0
}

{
       total += $1
}

END{
       print total
}



你这是放在一个脚本文件里面吗?
你用这个运行的吗?
awk -f sum md5sum.txt


如果是的话,我也不知道该怎么回答了


while read line
do
     i=`echo $line | sed 's#/#\\/#g'`
done < $checksum_file



你这得到了什么,什么也没有输出呀,建义看看SHELL基础先

论坛徽章:
0
8 [报告]
发表于 2009-04-22 00:39 |只看该作者

回复 #7 wtuter 的帖子

#awk script file, named, say sum
BEGIN
{
      total=0
}

{
       total += $1
}

END{
       print total
}
以上是放在一个名为sum的文件里,md5sum.txt是一个具有本贴开头说的文件格式的一个文件,运行awk -f sum md5sum.txt

shell基础我看了,谢谢,呵呵!
我贴出来的只是一段脚本而已,让你迷惑了,不好意思。变量i是我下面要用到的。
应该这样写,呵呵。
while read line
do
     i=`echo $line | sed 's#/#\\/#g'`
     echo $i       #在这里发现没变
     ...........
     ...........
done < $checksum_file

论坛徽章:
0
9 [报告]
发表于 2009-04-22 00:45 |只看该作者
1、
脚本文件没有chmod +x?

2、
find /usr -type f -name "*" -print0 | xargs -0 md5sum > test-1.txt
无用参数多,find /usr -type f | xargs md5sum > test-1.txt 即可。

如果test-2.txt也是这样生成的,diff test-1.txt test-2.txt 就能给出差异行,如果有定制需求可man diff。

3、
BEGIN后面的{应该和它在同一行,不过这个BEGIN是没有意义的。

另外我觉得这个求和更没有意义……

论坛徽章:
0
10 [报告]
发表于 2009-04-22 00:53 |只看该作者

回复 #8 volunteer01 的帖子

try:
sed 's#/#\\\/#g'
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP