shell读取文件的几种方式
案例文本文件
[root@docker-01 ~]# cat a.txt ID name gender age email phone 1 Bob male 28 abc@qq.com 18023394012 2 Alice female 24 def@gmail.com 18084925203 3 Tony male 21 aaa@163.com 17048792503 4 Kevin male 21 bbb@189.com 17023929033 5 Alex male 18 ccc@xyz.com 18185904230 6 Andy female 22 ddd@139.com 18923902352 7 Jerry female 25 exdsa@189.com 18785234906 8 Peter male 20 bax@qq.com 17729348758 9 Steven female 23 bc@sohu.com 15947893212 10 Bruce female 27 bcbd@139.com 13942943905
按字符数量读取
read的-n选项和-N选项可以指定一次性读取多少个字符。
[root@docker-01 ~]# read -n 1 data <a.txt # 只读一个字符 [root@docker-01 ~]# read -n 100 data < a.txt # 读100个字符,但如果不足100字符时遇到换行符则停止读取 [root@docker-01 ~]# read -N 100 data < a.txt # 强制读取100字符,遇到换行符也不停止
如果按照字符数量读取,直到把文件读完,则使用while循环,且将文件放在while结构的后面,而不能放在while循环的条件位置:
[root@docker-01 ~]# while read -N 3 data;do echo "$data"; done < a.txt
按分隔符读取
read命令的-d选项可以指定读取文件时的分隔符。
[root@docker-01 ~]# read -d "m" data <a.txt # 一直读取,直到遇到字符m才停止,并将读取的数据保存到data变量中
如果要按分隔符读取并读完整个文件,则使用while循环:
[root@docker-01 ~]# while read -d "m" data ;do echo "$data"; done < a.txt
按行读取
read默认情况下就是按行读取的,一次读取一行。
[root@docker-01 ~]# read line <a.txt # 从a.txt中读取第一行保存到变量data中
如果要求按行读取完整个文件,则使用while循环:
[root@docker-01 ~]# while read line;do echo "$line"; done <a.txt
一次性读取整个文件
要一次性读取完整个文件,有两种方式:
- 按照字符数量读取,且指定的字符数要大于文件的总大小
- 按分隔符读取,且指定的分隔符是文件中不存在的字符,这样的话会一直读取,因为找不到分隔符而读完整个文件
[root@docker-01 ~]# read -N 1000000 data <a.txt [root@docker-01 ~]# echo $data # 指定超出文件大小的字符数量 [root@docker-01 ~]# read -d "_" data <a.txt [root@docker-01 ~]# echo $data # 指定文件中不存在的字符作为分隔符
done
按分隔符读取
read命令的-d选项可以指定读取文件时的分隔符。