`
nigelzeng
  • 浏览: 604693 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

echo命令的一个疑问

阅读更多

今天在做日志处理的时候发现了这么一个问题:

有这么一段数据,test.log

2011-12-12 00:01:25
2011-12-12 00:03:25
2011-12-12 00:05:25
2011-12-12 00:07:26
2011-12-12 00:09:26

 (结尾的$是通过vim里的 set list! 命令显示出来,表示的是一行结束)

 

当我通过一个for循环打印出这段数据的时候,问题出现了:

for x in `cat test.log`;do echo $x;done

 

 我期望的数据输入是每行的内容都是“2011-12-12 00:09:26”这种格式,但是结果却是这样:

2011-12-12
00:01:25
2011-12-12
00:03:25
2011-12-12
00:05:25
2011-12-12
00:07:26
2011-12-12
00:09:26

 空格被echo当成了换行输出,在vim输入set :list!,得到的结果没有异常:

2011-12-12 00:01:25$
2011-12-12 00:03:25$
2011-12-12 00:05:25$
2011-12-12 00:07:26$
2011-12-12 00:09:26$

 (空格还是空格,$符号位一行的结尾)

 

 

具体原因待查,不过已经找到一个替代方法:

cat test.log | while read x;do echo $x;done

 结果如下:

2011-12-12 00:01:25
2011-12-12 00:03:25
2011-12-12 00:05:25
2011-12-12 00:07:26
2011-12-12 00:09:26

 

 

 

 

------------------------------------分割线---------------------------------------------

参考了CU里的shell板块,问题可以这么解决:

 

IFS=$'\n';for i in $(<test.log);do echo $i:;done

 

 

shell手册里的解释:
$IFS
内部字段分隔符
此变量决定Bash如何分割字段,或是解释字符串时的字标识分割。
$IFS默认是空白字符(空格,制表符和新行符),它可以被重新设置。例如,在解释一个以逗号分割的数据文件里可设置成逗号分割。

 

IFS='\n'与 IFS=$'\n'是不一样的赋值:

IFS=$'\n'是指让bash按照ANSI C来解释$'string'中的string。

 

 

IFS为系统变量,对shell起作用,用于word splitting和read.

awk里试用自己的字段分隔符:FS定义。

 

blackold网友的一段代码说明了这个问题:
$ echo $0
bash

$ echo -En '\n'|xxd
0000000: 5c6e \n

$ (IFS='\n';for i in $(<urfile);do echo $i:;done)
:server1 ip1 password1
server2 ip2 password2
server3 ip3 password3:

$ echo -En $'\n'|xxd
0000000: 0a .

$ (IFS=$'\n';for i in $(<urfile);do echo $i:;done)
:server1 ip1 password1:
:server2 ip2 password2:
:server3 ip3 password3:

 

----EOF-------

分享到:
评论

相关推荐

    免费下载:自己整理的批处理命令文档

    - 通过阅读批处理命令文档,了解每个命令的具体用法和参数。 - 编写简单的批处理脚本,实践基础操作,逐步提高复杂度。 - 参考网络上的实例,学习如何解决实际问题。 - 加入技术论坛,与其他用户交流经验,解答...

    ubuntu下如何通过mail命令发送邮件

    - 这种方法适合于从一个文件中读取内容作为邮件正文进行发送。命令格式为: ```bash mail -s "主题" "邮箱地址" ``` - 其中,“path/filename”指定了包含邮件正文的文件路径。 #### 四、注意事项 - **...

    Linux命令大全(入门)

    这只是Linux命令大全中的一小部分,实际还包括更多命令和高级用法。学习并熟练掌握这些命令将有助于提升Linux系统的管理和维护能力。对于初学者,建议从常用命令开始,逐步深入学习更复杂的操作。同时,查阅`man`...

    <<我爱批处理>>-批处理命令大全/教程

    批处理,又称批处理脚本或批处理命令,是Windows操作系统中的一种自动化处理方式,它允许用户通过编写一系列的命令来执行多个操作,而无需反复手动输入。在"《我爱批处理》- 批处理命令大全/教程"中,你将深入学习...

    很简易windows版批处理

    例如,一个简单的批处理文件可能包含像`echo Hello World`和`pause`这样的命令,前者用于在命令行显示文本,后者则会暂停批处理的执行,等待用户按下任意键继续。 批处理的应用广泛,包括但不限于: 1. 文件管理和...

    windows bat 批处理实例合集

    - **管道符`|`**:将前一个命令的输出作为后一个命令的输入,如`dir | find "file.txt"`查找包含"file.txt"的目录项。 - **重定向符`&gt;`/`**:改变命令的输入/输出,如`dir &gt; log.txt`将dir命令的输出保存到log.txt...

    批处理教程-网络收集整理。

    - **管道与重定向**:`|`用于将一个命令的输出作为另一个命令的输入,`&gt;`和`用于重定向输入和输出。 4. **批处理在实际应用中的例子** - **文件管理**:批量改名、复制、移动、删除大量文件。 - **系统维护**:...

    UNIX.Shells部分答案

    Unix Shell是Unix或类Unix操作系统中的一个命令解释器,它为用户提供了一个与操作系统内核交互的接口。用户可以通过Shell输入命令,Shell则负责解析这些命令并执行相应的系统调用。 2. **主要的Unix Shell类型** ...

    linux 中的atq命令

    ##### 示例2: 使用at命令提交一个任务 ```bash at now + 10 minutes ``` 接下来,在at命令提示符下输入要执行的命令或脚本内容,然后按`Ctrl+D`结束输入: ```bash at&gt; echo "1111" at&gt; ``` 这时,系统会给出提交...

    5Shell脚本.zip

    Expect是一个用于自动化交互式程序的工具,它可以与Shell脚本结合使用,模拟用户与命令行接口的交互,如在SSH登录、输入密码等场景。`expect`关键字用于创建这样的脚本。 3. **正则表达式**: 正则表达式是用于...

    性能测试监控数据库 打印AWR报告

    `命令创建一个起始快照。这个快照记录了当前时刻的数据库状态。 6. **结束性能测试后再次创建快照**: 压力测试结束后,执行`exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();`生成结束快照,记录此时的数据库...

    C shell编程初步

    它融合了其他Shell的优点,并且引入了一个类似于INTERLISP中的redo机制的历史记录功能。C Shell不仅简化了Shell脚本的编写过程,还特别注重提供更友好的交互体验。 #### 二、C Shell的特点 1. **历史记录机制**:...

    Linux 中清空或删除大文件内容的五种方法

    `true` 命令是Shell的一个内置命令,通常被用作一个无操作(no-op)指令。通过将 `true` 的输出重定向到文件中,可以实现清空文件的目的。 **命令示例**: ``` true &gt; access.log ``` 另一种方式是使用冒号(`:`)符号...

    1111网络协议详解.doc

    ICMP,全称为Internet Control Message Protocol,即网际控制消息协议,是TCP/IP协议族中的一个重要组成部分。其主要功能是用于网络故障检测和报告,帮助网络设备如路由器和主机间传递错误信息或状态更新。在日常...

    批量删除SVN

    3. **脚本编写**:为了批量操作,你可以编写一个批处理脚本(对于Windows)或shell脚本(对于Linux或Mac)。在脚本中,使用SVN命令行工具(例如`svn delete`或简写`svn del`)来删除指定的文件或目录。 例如,一个...

    Linux知识点总结.docx

    1. 打开VirtualBox,创建一个新的虚拟机,选择Linux作为操作系统类型,Red Hat作为具体版本。 2. 分配足够的内存和硬盘空间,设置网络适配器为NAT或桥接模式,以便虚拟机可以访问网络。 3. 挂载ISO镜像文件`rhel-...

    linux实战培训初级班第三次课课前考试题.docx

    硬链接则是文件的另一个入口,它们共享相同的inode(文件系统索引节点),删除其中一个文件不会影响另一个。 3. Linux shell中单引号、双引号和不加引号的区分: 单引号(' ')内的内容会被当作纯文本处理,不进行...

    linux下make命令实现输出高亮的方法

    为此,本文将介绍一种方法,即利用第三方工具`color-compile`来实现`make`命令输出的高亮显示,从而方便用户快速定位问题所在。 #### 环境准备 在开始之前,请确保您的Linux系统中已安装必要的工具和库。对于...

Global site tag (gtag.js) - Google Analytics