1.16字段分隔符和迭代器

内部字段分隔符(Internal Field Separator,IFS)是shell脚本编程的一个重要概念。下面将讨论把单个数据流划分成不同数据元素的定界符(delimiter),内部字段分隔符是用于特定用途的定界符。IFS是存储定界符的环境变量。它是当前shell环境默认使用的默认定界字符串。

1、考虑一种情形,我们需要迭代一个字符串或逗号分隔型数值(Comma Separated Value,CSV)中的单词。如果是前一种,则使用IFS=".";如果是后一种,则使用IFS=","。如下

考虑CSV数据的情形:

data="name,sex,rollno,location"

我们可以使用IFS读取变量中的每一个条目。

oldIFS=$IFS

IFS=, #now IFS为,

for item in $data;

do

  echo Item: $item

done

IFS=$oldIFS

IFS的默认值为空白符(换行符、制表符或者空格)

2、在文件/etc/passwd中,每一行包含了由冒号分隔的多个条目。文件中的每行都对应一位用户的相关属性。

考虑这样的输入:root:x:0:0:root:/root:/bin/bash。每行的最后一项指定了用户的默认shell。利用IFS打印出用户以及他们对应的默认shell:

#!/bin/bash

#演示IFS的用法

line="root:x:0:0:root:/root:/bin/bash"

oldIFS=$IFS;

IFS=":";

count=0

for item in $line

do

[ $count -eq 0 ] && user=$item;

[ $count -eq 6] && shell=$item;

  let count++;

done;

IFS=$oldIFS

echo $user\‘s shell is $shell;

输出为

root‘s shell is /bin/bash

对一些列值进行迭代时,循环非常有用;

for 循环

for var in list;

do

  commands;#使用变量$var

done

list 可以是一个字符串,也可以是一个序列。

echo {1..50}能够生成一个从1~50的数字列表。同理echo {a..z}或{A..Z}或{a..h}可以生成子母表。

变量i在每次迭代的过程中都会保存一个字符,范围从a~z;

for i in {a..z};do actions;done;

for循环也可以采用C语言的for格式:

for(i=0;i<10;i++)

  commands;#使用变量$i

while循环

while condition

  do

  commands;

  done

用true作为循环条件能够产生无限循环。

until循环

在bash中还可以使用一个特殊的循环until。它会一直执行循环,直到给定的条件为真。

x=0;

until [ $x -eq 9 ];#条件是[ $x -eq 9 ]

do

  let x++;

  echo $x;

done

时间: 2024-11-10 02:04:16

1.16字段分隔符和迭代器的相关文章

mysql导出文件到txt并指定字段分隔符;mysql导出到xls文件sql试例

mysql > select m.asset_id, m.asset_name, m.director, m.actor, m.country_of_origin, m.years, concat('http://192.167.1.120:15414/',p.poster_url),m.category  from ao_movie_tab m, ao_poster_tab p where m.asset_id = p.asset_id group by m.asset_id order by

C++ Primer 学习笔记_42_STL实践与分析(16)–再谈迭代器【上】

STL实践与分析 --再谈迭代器[上] 引言: 另外三种迭代器类型: 1)插入迭代器:这类迭代器与容器绑定在一起,实现在容器中插入元素的功能. 2)iostream迭代器:这类迭代器可以与输入与输出流绑定在一起,用于迭代遍历所关联的IO流. 3)反向迭代器:这类迭代器实现向后遍历,而不是向前遍历,所有的容器都定义了自己的reverse_iterator类型,由rbegin和rend成员函数返回. 上述迭代器都在iterator头文件中定义. 一.插入迭代器 前面曾经提到的back_inserte

【makefile】Makefile:16: *** 遗漏分隔符 。停止。

随手写了一个makefile文件,如下: 然后在执行make 报错,错误情况如下: 在网上度娘了一下,原因如下: gcc.rm.cp前面是tab分割符,不能用空格. 修改后的Makefile如下: 看到没?rm及make的字体颜色都变了. 原文地址:https://www.cnblogs.com/vossveen/p/8167054.html

LINUX SHELL脚本攻略笔记[速查]

Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgrep shell数学运算 命令状态 文件描述符和重定向 cat 数组和关联数组 alias date 调试脚本 函数和参数 管道 读取命令输出 read 字段分隔符和迭代器 循环 比较和测试 find xargs tr md5sum sha1sum 对目录进行校验 sort uniq tempfile split bash变量匹配切分 exp

linux脚本攻略

ls #列出以a和o开头的所有文件 [[email protected] ~]# ls anaconda-ks.cfg nss-pam-ldapd-0.9.8-1.gf.el7.x86_64.rpm openldap-clients-2.4.44-21.el7_6.x86_64.rpm original-ks.cfg tools [[email protected] ~]# ls [ao]* anaconda-ks.cfg openldap-clients-2.4.44-21.el7_6.x86

linux学习:特殊符号,数学运算,图像与数组与部分终端命令用法整理

一:特殊符号用法整理 算术比较-eq 等于-ne 不等于-gt 大于-lt 小于-ge 大于或等于-le 小于或等于-a 逻辑与 and &&-o 逻辑或 or ||[ $var -eq 0 ]    #当$var等于0时,返回真[ $var -ne 0 ]    #当$var为非0时,返回真[ $var1 -ne 0 -a $var2 -gt 2 ][ $var1 -ne 0 -o $var2 -gt 2 ] 字符串比较[[ $str1 = $str2 ]]     #当str1等于st

Linux:批量修改分隔符(awk、BEGIN、FS、OFS、print命令)

批量修改文件的分隔符,可以用FS和OFS命令 FS:Field Separator,字段分隔符 OFS:Out of Field Separator,输出字段分隔符 假设有这么一个文件file1.txt,其内容如下: 可以看出,file1的分隔符很长,不止一个空格符组成,因此我们需要先将分隔符统一一下,输入一下命令: awk -F " " '{if($1~/^16/) print $1,$2,$3,$4}' file1.txt > file2.txt 生成file2.txt,如下

如何使用 awk 输出文本中的字段和列

首先我们要知道,awk 能够自动将输入的行,分隔为若干字段.每一个字段就是一组字符,它们和其他的字段由一个内部字段分隔符分隔开来. 如果你熟悉 Unix/Linux 或者懂得 bash shell 编程,那么你应该知道什么是内部字段分隔符(IFS)变量.awk 中默认的 IFS 是制表符和空格. awk 中的字段分隔符的工作原理如下:当读到一行输入时,将它按照指定的 IFS 分割为不同字段,第一组字符就是字段一,可以通过 $1 来访问,第二组字符就是字段二,可以通过 $2 来访问,第三组字符就是

awk字段和引用的分离

awk使用字段操作符$来指定字段.在该操作符后面跟着一个数字或变量,用于标识字段的位置."$1" 表示第一个字段, "$2" 表示第二个字段等等."$0 "表示整个输入记录.下面的例子显示了第一个字段是姓,第二个字段是名字,后面是电话号码. $ awk '{ print $2,$1,$3 }' names Robinson John 666-555-1111 $1表示名字, $2表示姓,而$3表示电话号码.Print语句中分隔每个参数的逗号使得输