Shell Tips - how to read file line by line?

Recently I am write some shell scripts. I also find some common shell tips that maybe useful for us when we need write shell. So, I wrote them in my Blog for guys who need it.

How to read file line by line? (sh)

In general, use "while" to loop call "read" :

All example is in #!/bin/sh

1.

readline1 ()
{
inputFile=$1
cat $inputFile | while read LINE
do
        echo $LINE

done
}

 

2.

readline2 ()
{

       inputFile=$1
       while read LINE
       do
               echo $LINE
       done < $1
}

3.

readline3 ()
{

        inputFile=$1
        while line LINE
        do
                echo $LINE
        done < $1
}

 

note: realine3 will echo 2 nowline, becase "line" will read the content include newline.


4.

readline4 ()
{
exec    3<&0
exec  0<$1
while read LINE
do
    print $LINE
done

exec 0<&3
}
using fd redirection.

These method enough for me to handle loop read file. Here have even supported 12 function in  KSH .

Comments:

Why sh instead of ksh or ksh93? Also, don't forget to quote things! And the redirection approach is too cumbersome, in KSH this is what you want:

function kshcat {
         typeset line
         while read -r line
         do
                  print -r -- "$line"
         done < "$1"
}

Note the use of local variables (typeset), the use of read/print -r (if you need it -- see the manpage), the use of '--' to prevent lines that start with '-' from being interpreted as options to the echo or print command/built-in, and the use of double quotes around $line and $1 (so that if $1 contains whitespace you can still cat it).

Posted by Nico on June 29, 2007 at 06:34 PM CST #

Nico, thanks for your wonderful explain how to use KSH. I am writing a sh script, so I using sh instead of ksh.

Posted by william on July 03, 2007 at 07:00 AM CST #

#!/bin/sh

fail_file=/mrtg/web/web_check/log/fail`date +%y%m%d%H%M`.txt; # fail log 파일
out_file=/mrtg/web/web_check/web_check_main; # Web page main Temp파일
mailto="support@coconut.co.kr"; # mail 수신자

echo '<META HTTP-EQUIV="Refresh" CONTENT="180; URL=http://211.233.2.169/web_check/web_check_main.html"></HEAD>' > "$out_file"; # Web page title
echo "<font size=6 type=arial><B>Website check(안랩코코넛)</B></font><BR>" >> "$out_file"; # Web page title
echo "Date/Time : 20`date +%y%m%d%H%M`" >> "$out_file"; # Web page date
echo "<body><table border=1><TR>" >> "$out_file"; # Web page table 시작

echo "<TD bgcolor=gray><B>업체명</B></TD><TD bgcolor=gray><B>URL</B></TD><TD bgcolor=gray><b>응답시간</b></TD>" >> "$out_file";
# Web page column title

while read line
do

htmlf=" ";
timef=" ";
clr=" ";
tmp=" ";
tmp1=" ";
tmp2=" ";
flag=" ";
compa=" ";
fail=" ";
connerr=" ";
pingtmp1=" ";
pingtmp2=" ";
url=" ";
cname=" ";
porttemp=" ";
svr=" ";
portnum=" ";

url=${line#\*_\*}; # URL 추출
cname=${line%\*_\*}; # 업체명 추출
porttemp=${url#\*:\*};
svr=${url%%$\*/\*};

if [ "${line%%#\*}" != "$line" ]; then # URL 예외처리 확인
tmp="<TR bgcolor=#F2A6A6><TD>""$cname""</TD><TD><a href=http://""$url"">""$url""</a></TD><TD>예외처리</TD><TD></TD></TR>";
echo "$tmp" >> "$out_file";
continue; # 예외처리 URL일 경우 이하 script미실행
fi

if [ "$porttemp" == "$url" ]; then # port 정보 유무 확인
portnum="80"; # port 정보가 없으면 80
else
portnum=${porttemp%\*/\*}; # port 정보가 있으면 추출
svr=${url%\*:\*};
fi

error_file=/mrtg/web/web_check/log/"${line%%$\*/\*}"error`date +%y%m%d%H%M`; # Error로그 파일

connerr="$(/mrtg/web/web_check/httping-1.2.3/httping -t 10 -c 2 -g http://"$svr" -p "$portnum" | grep connects)";
# httping으로 port open여부 확인

if [ "${connerr%%$\*ok\*}" != "2 connects, 0 " ]; then # port open되어 있을 경우 ab 실행
/usr/bin/ab -k -v 3 http://"$url" > /mrtg/web/web_check/txt/"${line%%$\*/\*}".txt 2>> "$error_file"; # Web check 실행
else
echo "$url $cname ""$connerr" >> "$error_file"; # port 접속 실패할 경우 error파일 생성
echo "$connerr" > /mrtg/web/web_check/txt/"${line%%$\*/\*}".txt; # fail 파일 생성
fi

chmod 755 /mrtg/web/web_check/txt/"${line%%$\*/\*}".txt; # 페이지 결과값 파일 권한수정

htmlf="$(cat /mrtg/web/web_check/txt/"${line%%$\*/\*}".txt | grep "Response code")"; # 결과값 파일에서 Response code추출

if [ "${htmlf%%$\*:\*}" == "LOG" ]; then # 추출된 값의 200 코드여부 확인(200 code의 경우 LOG로 시작)
flag=" "; # 정상일 경우 flag를 공백으로 저장
rm -rf "$error_file"; # 생성된 Error 파일 삭제
else
fail="$url $cname $htmlf "`date +%y%m%d%H%M%S`; # 추출된 값이 200 코드가 아닐 경우 fail에 내용 저장
echo "$fail" >> "$fail_file"; # fail의 내용을 fail로그파일에 입력
echo " " >> "$fail_file";
flag="$htmlf"; # 비정상일 경우 flag에 Response code값 저장
fi

if [ -s "$error_file" ]; then # Error file이 있을 경우(AB 실행시 에러가 있을 경우)
echo "$line" >> "$error_file"; # URL을 Error file에 저장
mail -s '## WEBSite_Check Connection Error ##' "$mailto" < "$error_file"; # 경고메일 발송
compa="$(cat "$error_file")"; # Error 파일의 내용을 compa에 저장
else
compa=" ";
rm -rf "$error_file"; # Error file이 없을 경우 삭제

timef="$(cat /mrtg/web/web_check/txt/"${line%%$\*/\*}".txt | grep "Time taken for tests")"; # 지연시간 Query
tmp1=${timef##\* }; # 지연시간 추출 1차
tmp2=${tmp1%%$\*.\*}; # 지연시간 추출 2차

if [ "$tmp2" == " " ]; then # 지연시간 추출된 값이 공백일 경우 9999로 저장
tmp2="9999";
fi

if [ "$tmp2" -le 2 ]; then # 3초이내 하얀색
clr=white;
else if [ "$tmp2" -lt 6 ] && [ "$tmp2" -gt 2 ]; then # 3초보다 크고 6초보다 작거나 같을때 노란색
clr=yellow;
else
clr=red; # 둘 다 아니면 빨간색
flag="Unable to connect(Unknown Reason) or Delay(more than 5 seconds)"; # flag에 내용 저장
fail="$url $cname $htmlf "`date +%y%m%d%H%M%S`; # fail내용 저장
echo "$fail" "$flag" "$tmp1" >> "$fail_file"; # fail파일에 저장
echo " ";
fi
fi
fi
if [ "$flag" != " " ]; then # flag가 null값이 아니면(정상이 아니면) 빨간색
clr=red;
fi

if [ "$compa" != " " ]; then # AB실행 시 에러가 발생했으면 compa내용, 에러가 없었으면 fail내용을 Web page파일에 저장
tmp="<TR bgcolor=""$clr""><TD>""$cname""</TD><TD><a href=http://""$url"">""$url""</a></TD><TD><a href=txt/"${line%%$\*/\*}".txt>""$tmp1""</TD><TD><font size=2>""$compa""</font></TD></TR>";
else
tmp="<TR bgcolor=""$clr""><TD>""$cname""</TD><TD><a href=http://""$url"">""$url""</a></TD><TD><a href=txt/"${line%%$\*/\*}".txt>""$tmp1""</TD><TD><font size=2>""$flag""</font></TD></TR>";
fi

echo "$tmp" >> "$out_file";

done < /mrtg/web/web_check/url.txt; # URL 파일 지정

echo "</TD></TR></table></body>" >> "$out_file"; # Web page temp파일 끝.

cat "$out_file" > "$out_file".html # Web page temp파일을 html파일로 저장

if [ -s "$fail_file" ]; then # fail내용이 있을 경우 메일발송
mail -s '## WEBSite_Check fail ##' "$mailto" < "$fail_file";
fi

Posted by guest on March 13, 2008 at 02:53 PM CST #

Post a Comment:
Comments are closed for this entry.
About

williamxue

Search

Archives
« April 2014
SunMonTueWedThuFriSat
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
Today