Linux Shell,遍历数组或文件的几种不同写法

Source

Linux Shell,遍历数组或文件的几种不同写法

遍历数组

1. 使用for循环

array=(元素1 元素2 元素3 ...)
for i in "${array[@]}"
do
   echo $i
done

2. 使用while循环和bash的内置变量

array=(元素1 元素2 元素3 ...)
length=${
    
      #array[@]}
index=0
while [ $index -lt $length ]
do
    echo ${array[$index]}
    let index=index+1
done

3. 使用C风格的for循环

array=(元素1 元素2 元素3 ...)
for (( i=0; i<${#array[@]}; i++ ));
do
    echo ${array[$i]}
done

遍历文件

1. 使用while循环读取文件行

while IFS= read -r line
do
  echo "$line"
done < 文件名

2. 使用for循环通过cat命令遍历文件每一行

for line in $(cat 文件名)
do
   echo $line
done

请注意,第二种方法(使用cat命令)可能会在处理包含空格的行时出现问题。

cat(concatenate的缩写)命令是Linux中用于连接并打印文件内容到标准输出设备的工具。其最基本的用途是读取一个或多个文件并将它们的内容显示在终端上。除了简单的读取文件,cat命令还经常与其他命令结合使用,进行更复杂的文本操作。它是文本查看与处理中非常基础且强大的工具。

基本用法:

  • 查看文件内容:cat 文件名。这是最简单也是最常用的用法,可以查看一个或多个文件的内容。
  • 合并文件:cat 文件1 文件2 > 合并后的文件名。这条命令会将文件1和文件2的内容合并,并重定向输出到一个新的文件中。
  • 添加文件内容到已存在文件的末尾:cat 文件1 >> 文件2。这会将文件1的内容添加到文件2的末尾,而不是覆盖原有内容。

虽然cat命令非常有用,但在处理包含特殊字符(如空格、制表符)或大文件时,它可能不是最佳选择。特别是当使用cat命令通过for循环读取文件内容时,若文件中的行包含空格或特殊字符,这些行可能会被错误地分割,导致输出结果与预期不符。这是因为for循环会根据IFS(内部字段分隔符)的值(默认为空格、制表符和换行符)来分割cat的输出。

3. 使用awk

awk '{print}' 文件名

awk是一个功能强大的文本处理语言,专门设计用于在Linux/Unix环境下对文本和数据进行处理和分析。awk命令能够处理复杂的文本分析任务,包括模式匹配、文本过滤和数据报告生成等。

基本用法:

  • awk '{动作}' 文件名:对文件进行操作,其中{动作}部分定义了对匹配行要执行的操作,例如{print}表示打印每一行。
  • awk '/模式/ {动作}' 文件名:只对包含特定模式的行执行动作。模式可以是正则表达式,用于筛选出含有特定文本的行。

高级特性:

  • 字段分割:awk默认使用空格和制表符作为字段分隔符,每行的每个字段可以用$1, $2, …$n访问,其中$0代表整行。
  • 内置变量:awk提供了多种内置变量,例如NR(当前记录数)和NF(当前记录的字段数),用于在处理文本时提供额外的灵活性。
  • 条件语句和循环:awk支持if条件语句、for循环等控制结构,使其能够执行复杂的文本处理操作。

4. 使用sed

sed -n 'p' 文件名

sed(stream editor的缩写)是一个强大的流编辑工具,主要用于文本替换,但也可以通过不做任何替换的方式来遍历文件的每一行。尽管它主要被设计用于文本替换,sed也常用于删除、插入、选择等多种文本处理任务。

基本用法:

  • sed 's/查找的文本/替换的文本/' 文件名:将文件中的文本替换为其他文本。
  • sed -n 'p' 文件名:打印文件的每一行。使用-n选项与p命令结合使用,可以遍历文件的每一行,类似于cat命令。

高级特性:

  • 地址定位:sed允许使用行号或模式定位到特定的行,然后对这些行执行操作。例如,sed -n '1,5p' 文件名只打印文件的前五行。
  • 正则表达式:sed支持使用正则表达式进行模式匹配,增加了处理文本的灵活性和强大的能力。
  • 脚本文件:对于复杂的文本处理任务,可以将sed命令保存在一个脚本文件中,然后通过sed -f 脚本文件名来执行这些命令,使操作更加高效和模块化。

参考链接