免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3269 | 回复: 6
打印 上一主题 下一主题

[文本处理] 复杂命令双引号改单引号求助 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-24 15:25 |只看该作者 |倒序浏览
本帖最后由 bikkuri 于 2014-08-24 17:16 编辑

大家好!
我碰到了一件很奇怪的事情,想向大家请教。
我的服务器上有这样一些文件,存放路径如下:
  1. [root@cloudband-be deferred]# ls -l /var/spool/postfix/deferred/*/*
  2. -rwx------ 1 postfix postfix 3114 Aug 24  2014 /var/spool/postfix/deferred/0/0EFE15405FF
  3. -rwx------ 1 postfix postfix 1365 Aug 24  2014 /var/spool/postfix/deferred/5/545615405FB
  4. -rwx------ 1 postfix postfix 3114 Aug 24  2014 /var/spool/postfix/deferred/7/7427154060C
  5. -rwx------ 1 postfix postfix 3486 Aug 24  2014 /var/spool/postfix/deferred/9/9C2AF54060F
  6. -rwx------ 1 postfix postfix 3462 Aug 24  2014 /var/spool/postfix/deferred/B/B055A540608
  7. -rwx------ 1 postfix postfix 1737 Aug 24  2014 /var/spool/postfix/deferred/D/D04E354046A
  8. -rwx------ 1 postfix postfix 3486 Aug 24  2014 /var/spool/postfix/deferred/D/DABB85405FE
  9. -rwx------ 1 postfix postfix 3275 Aug 24  2014 /var/spool/postfix/deferred/D/DF04A54060D
  10. -rwx------ 1 postfix postfix 3115 Aug 24  2014 /var/spool/postfix/deferred/E/E9C79540610
复制代码
然后我用以下的for命令来找出所有文件名,也是可以正常得到结果的。
  1. [root@cloudband-be deferred]# for file in /var/spool/postfix/deferred/*/*; do echo $file;done
  2. /var/spool/postfix/deferred/0/0EFE15405FF
  3. /var/spool/postfix/deferred/5/545615405FB
  4. /var/spool/postfix/deferred/7/7427154060C
  5. /var/spool/postfix/deferred/9/9C2AF54060F
  6. /var/spool/postfix/deferred/B/B055A540608
  7. /var/spool/postfix/deferred/D/D04E354046A
  8. /var/spool/postfix/deferred/D/DABB85405FE
  9. /var/spool/postfix/deferred/D/DF04A54060D
  10. /var/spool/postfix/deferred/E/E9C79540610
复制代码
之后就很诡异了,我想把这个for命令做一个alias,却发现执行alias之后的命令,得到的结果却和之前完全不一样。
  1. [root@cloudband-be deferred]# alias listfile="for file in /var/spool/postfix/deferred/*/*; do echo $file;done"
  2. [root@cloudband-be deferred]# listfile
  3. /var/spool/postfix/deferred/E/E9C79540610
  4. /var/spool/postfix/deferred/E/E9C79540610
  5. /var/spool/postfix/deferred/E/E9C79540610
  6. /var/spool/postfix/deferred/E/E9C79540610
  7. /var/spool/postfix/deferred/E/E9C79540610
  8. /var/spool/postfix/deferred/E/E9C79540610
  9. /var/spool/postfix/deferred/E/E9C79540610
  10. /var/spool/postfix/deferred/E/E9C79540610
  11. /var/spool/postfix/deferred/E/E9C79540610
复制代码
请问这是怎么回事呢?
要如何做才能使alias的结果和原命令的结果一样呢?
谢谢。

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
2 [报告]
发表于 2014-08-24 16:51 |只看该作者
看来是双引号的问题,改用单引号就可以得到正确结果了。
  1. [root@cloudband-be ~]# alias listfile='for file in /var/spool/postfix/deferred/*/*; do echo $file;done'
  2. [root@cloudband-be ~]# listfile
  3. /var/spool/postfix/deferred/0/0EFE15405FF
  4. /var/spool/postfix/deferred/5/545615405FB
  5. /var/spool/postfix/deferred/7/7427154060C
  6. /var/spool/postfix/deferred/9/9C2AF54060F
  7. /var/spool/postfix/deferred/B/B055A540608
  8. /var/spool/postfix/deferred/D/D04E354046A
  9. /var/spool/postfix/deferred/D/DABB85405FE
  10. /var/spool/postfix/deferred/D/DF04A54060D
  11. /var/spool/postfix/deferred/E/E9C79540610
复制代码

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
3 [报告]
发表于 2014-08-24 16:56 |只看该作者
本帖最后由 bikkuri 于 2014-08-24 16:58 编辑

但是但是但是,如果我要把一个很长的很复杂的命令由双引号改成单引号,就会出错。
这个命令的出处来自我的另外一个帖子:
http://bbs.chinaunix.net/thread-4151516-1-1.html
大家可以帮我看看是哪里错了,应该怎么改吗?
  1. [root@cloudband-be ~]# alias getPass="for file in /var/spool/postfix/deferred/*/*; do strings $file|awk -v OFS=\"|\" 'match(\$0,/(Date:[^)]*\\))|(Username|Password): *[^ ]*/,a){r[substr(a[0],1,1)]=a[0]}END{print r[\"U\"],r[\"P\"],r[\"D\"]}';done"
  2. [root@cloudband-be ~]# getPass
  3. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  4. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  5. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  6. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  7. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  8. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  9. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  10. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  11. Username:   kamemiya|Password: fpMMduNF|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  12. [root@cloudband-be ~]#
  13. [root@cloudband-be ~]# alias getPass='for file in /var/spool/postfix/deferred/*/*; do strings $file|awk -v OFS="|" \'match(\$0,/(Date:[^)]*\\))|(Username|Password): *[^ ]*/,a){r[substr(a[0],1,1)]=a[0]}END{print r["U"],r["P"],r["D"]}\';done'
  14. -bash: syntax error near unexpected token `('
  15. [root@cloudband-be ~]#
复制代码

论坛徽章:
0
4 [报告]
发表于 2014-08-24 22:24 |只看该作者
回复 1# bikkuri
试了单引号双引号试晕了, 楼主不如暂时把命令写成脚本放到shell环境变量里面去, 也一样灰常方便效率

   

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
5 [报告]
发表于 2014-08-25 00:08 |只看该作者
本帖最后由 blackold 于 2014-08-25 00:10 编辑

可以这样做,不过太别扭。

对于 bash , 单引号中不能有单引号,即使是转义的单引号。

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
6 [报告]
发表于 2014-08-25 09:00 |只看该作者
谢谢您的指点。
  1. alias getPass='for file in /var/spool/postfix/deferred/*/*; do strings $file|awk -v OFS="|" "match(\$0,/(Date:[^)]*\\))|(Username|Password): *[^ ]*/,a){r[substr(a[0],1,1)]=a[0]}END{print r[\"U\"],r[\"P\"],r[\"D\"]}";done'
复制代码
改成这样以后可以正常执行了。
非常感谢!

blackold 发表于 2014-08-25 00:08
可以这样做,不过太别扭。

对于 bash , 单引号中不能有单引号,即使是转义的单引号。

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
7 [报告]
发表于 2014-08-25 09:08 |只看该作者
把结果赋给一个值,你可以用反引号``或者$()
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP