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--

posted @ 2018-11-13 10:25  菊次郎的秋天  阅读(13956)  评论(0编辑  收藏  举报