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 .

3 thoughts on “Shell Tips – how to read file line by line?

  1. 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).

  2. #!/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&gt;’ > "$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>&quot;;
    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&quot; -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&quot; > /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

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s