今天在做日志处理的时候发现了这么一个问题:
有这么一段数据,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-------
分享到:
相关推荐
- 通过阅读批处理命令文档,了解每个命令的具体用法和参数。 - 编写简单的批处理脚本,实践基础操作,逐步提高复杂度。 - 参考网络上的实例,学习如何解决实际问题。 - 加入技术论坛,与其他用户交流经验,解答...
- 这种方法适合于从一个文件中读取内容作为邮件正文进行发送。命令格式为: ```bash mail -s "主题" "邮箱地址" ``` - 其中,“path/filename”指定了包含邮件正文的文件路径。 #### 四、注意事项 - **...
这只是Linux命令大全中的一小部分,实际还包括更多命令和高级用法。学习并熟练掌握这些命令将有助于提升Linux系统的管理和维护能力。对于初学者,建议从常用命令开始,逐步深入学习更复杂的操作。同时,查阅`man`...
批处理,又称批处理脚本或批处理命令,是Windows操作系统中的一种自动化处理方式,它允许用户通过编写一系列的命令来执行多个操作,而无需反复手动输入。在"《我爱批处理》- 批处理命令大全/教程"中,你将深入学习...
例如,一个简单的批处理文件可能包含像`echo Hello World`和`pause`这样的命令,前者用于在命令行显示文本,后者则会暂停批处理的执行,等待用户按下任意键继续。 批处理的应用广泛,包括但不限于: 1. 文件管理和...
- **管道符`|`**:将前一个命令的输出作为后一个命令的输入,如`dir | find "file.txt"`查找包含"file.txt"的目录项。 - **重定向符`>`/`**:改变命令的输入/输出,如`dir > log.txt`将dir命令的输出保存到log.txt...
- **管道与重定向**:`|`用于将一个命令的输出作为另一个命令的输入,`>`和`用于重定向输入和输出。 4. **批处理在实际应用中的例子** - **文件管理**:批量改名、复制、移动、删除大量文件。 - **系统维护**:...
Shell脚本的一个显著特点是按行解释执行,也就是说,Shell解释器逐行读取脚本文件并执行其中的命令。在编写脚本时,可以使用echo命令后跟反引号(`)来执行子shell中的命令,并获取其输出结果。在编写完成后,需要...
Unix Shell是Unix或类Unix操作系统中的一个命令解释器,它为用户提供了一个与操作系统内核交互的接口。用户可以通过Shell输入命令,Shell则负责解析这些命令并执行相应的系统调用。 2. **主要的Unix Shell类型** ...
##### 示例2: 使用at命令提交一个任务 ```bash at now + 10 minutes ``` 接下来,在at命令提示符下输入要执行的命令或脚本内容,然后按`Ctrl+D`结束输入: ```bash at> echo "1111" at> ``` 这时,系统会给出提交...
Expect是一个用于自动化交互式程序的工具,它可以与Shell脚本结合使用,模拟用户与命令行接口的交互,如在SSH登录、输入密码等场景。`expect`关键字用于创建这样的脚本。 3. **正则表达式**: 正则表达式是用于...
`命令创建一个起始快照。这个快照记录了当前时刻的数据库状态。 6. **结束性能测试后再次创建快照**: 压力测试结束后,执行`exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();`生成结束快照,记录此时的数据库...
它融合了其他Shell的优点,并且引入了一个类似于INTERLISP中的redo机制的历史记录功能。C Shell不仅简化了Shell脚本的编写过程,还特别注重提供更友好的交互体验。 #### 二、C Shell的特点 1. **历史记录机制**:...
`true` 命令是Shell的一个内置命令,通常被用作一个无操作(no-op)指令。通过将 `true` 的输出重定向到文件中,可以实现清空文件的目的。 **命令示例**: ``` true > access.log ``` 另一种方式是使用冒号(`:`)符号...
ICMP,全称为Internet Control Message Protocol,即网际控制消息协议,是TCP/IP协议族中的一个重要组成部分。其主要功能是用于网络故障检测和报告,帮助网络设备如路由器和主机间传递错误信息或状态更新。在日常...
3. **脚本编写**:为了批量操作,你可以编写一个批处理脚本(对于Windows)或shell脚本(对于Linux或Mac)。在脚本中,使用SVN命令行工具(例如`svn delete`或简写`svn del`)来删除指定的文件或目录。 例如,一个...
1. 打开VirtualBox,创建一个新的虚拟机,选择Linux作为操作系统类型,Red Hat作为具体版本。 2. 分配足够的内存和硬盘空间,设置网络适配器为NAT或桥接模式,以便虚拟机可以访问网络。 3. 挂载ISO镜像文件`rhel-...
硬链接则是文件的另一个入口,它们共享相同的inode(文件系统索引节点),删除其中一个文件不会影响另一个。 3. Linux shell中单引号、双引号和不加引号的区分: 单引号(' ')内的内容会被当作纯文本处理,不进行...
为此,本文将介绍一种方法,即利用第三方工具`color-compile`来实现`make`命令输出的高亮显示,从而方便用户快速定位问题所在。 #### 环境准备 在开始之前,请确保您的Linux系统中已安装必要的工具和库。对于...