Shell脚本逐行读取文本内容并拆分,根据条件筛选文件
- 时间:2018-11-13 整理:byzqy
需求:
最近帮朋友写了一段脚本,他的需求是根据一份产品清单,去服务器上捞取对应产品编号的测试Log,数量大概有9000~10000条左右。文本内容大致如下,数据有4列,分别表示:产品编号、员工编号、测试日期、质量等级。需要筛选出质量等级为“1”的产品的测试数据,数据存储在以各自员工编号命名的不同测试日期的文件夹下。log文件名中包含完整产品编号。
文件:adc.txt
1 S0001L0001;TALLYMAN01;20180101;1 2 S0001L0002;TALLYMAN01;20180102;0 3 S0001L0003;TALLYMAN01;20180103;1 4 S0001L0004;TALLYMAN01;20180104;0 5 S0001L0005;TALLYMAN01;20180105;1 6 S0002L0006;TALLYMAN02;20180106;0 7 S0002L0007;TALLYMAN02;20180107;1 8 S0002L0008;TALLYMAN02;20180108;0 9 S0002L0009;TALLYMAN02;20180109;1 10 S00020L010;TALLYMAN02;20180110;0
解决:
1、使用循环逐行读取文本文件;
2、然后再将每一行的文本按照分号(;)进行分割,得到4个参数,分别用来代表拿到的产品编号、员工编号、测试日期、质量等级;
3、根据实际情况设定log存放的目录,并代入我们获取到的参数,必要时可使用通配符。执行查找并复制文件。
脚本:catch_log.sh
1 #!/bin/bash 2 3 FILENAME=abc.txt 4 5 function While_read_LINE(){ 6 #读取行内容 7 cat $FILENAME | while read LINE 8 do 9 echo "$LINE" 10 11 #拆分字符串到数组 12 str=$LINE 13 OLD_IFS="$IFS" 14 IFS=";" 15 arr=($str) 16 IFS="$OLD_IFS" 17 18 #遍历回显数组 19 #for s in ${arr[@]} 20 #do 21 #echo "$s" 22 #done 23 24 #为自定义变量赋值 25 PARAM_1=${arr[0]} 26 PARAM_2=${arr[1]} 27 PARAM_3=${arr[2]} 28 PARAM_4=${arr[3]} 29 30 #根据条件执行查找并拷贝 31 if [ "$PARAM_4"x = "1"x ]; then 32 #设定筛选条件 33 SERVER_ADDRESS=/mnt/server/ProductTest/$PARAM_2/FAIL/$PARAM_3/ 34 LOCAL_ADDRESS=/home/user/Desktop/result/ 35 TARGET_FILE_NAME=$(PARAM_1)_*.txt 36 #执行拷贝 37 cp $(find "$SERVER_ADDRESS" -name "$TARGET_FILE_NAME") $LOCAL_ADDRESS 38 fi 39 40 done 41 } 42 43 While_read_LINE
备注:
1、在Ubuntu16.04上执行该bash文件时,记得要对catch_log.sh添加可执行权限;
2、将abc.txt和bash文件放在同一目录下,否则abc.txt不会被找到;
3、需要在Desktop上手动创建result文件夹,否则cp文件时找不到路径会报错;
4、使用方法是打开终端(Terminal),然后将catch_log.sh拖进去,然后按下回车键执行。
--the end--