Bash脚本从整个文件夹的文件中读取特定值

时间:2014-03-28 14:08:44

标签: bash awk

我在创建从整个文件夹的所有文件中读取特定值的脚本时遇到问题

我在目录中有许多电子邮件文件,我需要从每个文件中提取2个特定值。

之后,我必须将它们放入一个看起来像这样的新文件中:

--------------
To: value1

value2
--------------

这就是我想要做的,但我不知道如何创建脚本:

# I am putting the name of the files into a temp file
`ls -l | awk '{print $9 }' >tmpfile` 

# use for the name of a file
`date=`date +"%T" 

# The first specific value from file (phone number)
var1=`cat tmpfile | grep "To: 0" | awk '{print $2 }' | cut -b -10 `

# The second specific value from file(subject)
var2=cat file | grep Subject | awk '{print $2$3$4$5$6$7$8$9$10 }'

# Put the first value in a new file on the first row
echo "To: 4"$var1""  > sms-$date

# Put the second value in the same file on the second row
echo ""$var2"" >>sms-$date 

.......

并对目录中的每个文件执行相同操作

我尝试使用while和for函数,但我无法完成脚本

谢谢

2 个答案:

答案 0 :(得分:0)

我对您的脚本进行了一些更改,希望它们对您有用:

#!/bin/bash

for file in *; do
    var1=$(awk '/To: 0/ {print substr($2,0,10)}' "$file")
    var2=$(awk '/Subject/ {for (i=2; i<=10; ++i) s=s$i; print s}' "$file")    
    outfile="sms-"$(date +"%T")
    i=0
    while [ -f "$outfile" ]; do outfile="sms-$date-"$((i++)); done
    echo "To: 4$var1" > "$outfile"
    echo "$var2" >> "$outfile"
done
  • for循环只会遍历您运行脚本的文件夹中的每个文件。
  • 我添加了一个额外的后缀$i到文件名的末尾。如果不存在具有相同日期的文件,则将创建不带后缀的文件。否则,$i的值将继续增加,直到没有相同名称的文件。
  • 我使用$( )而非反对,这只是个人偏好,但我认为可以更清楚,特别是当有其他引用时。
  • 通常不需要将grep的输出管道传输到awk。您可以使用awk语法在/ /中进行搜索。
  • 我删除了cut -b -10并将其替换为substr($2, 0, 10),后者会打印第2列中的前10个字符。
  • 它不会短得多,但我使用的是循环而不是$2$3...,我觉得它看起来有点整洁。
  • 两条输出线中不需要额外的"

答案 1 :(得分:0)

我建议尝试以下方法:

#!/bin/sh

RESULT_FILE=sms-`date +"%T"`
DIR=.

fgrep -l 'To: 0' "$DIR" | while read FILE; do
    var1=`fgrep 'To: 0' "$FILE" | awk '{print $2 }' | cut -b -10`
    var2=`fgrep 'Subject' "$FILE" | awk '{print $2$3$4$5$6$7$8$9$10 }'`

    echo "To: 4$var1" >>"$RESULT_FIL"
    echo "$var2" >>"$RESULT_FIL"
done