Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất

Bài viết tập trung vào cách đọc files trong bash scripts dùng while loop. Đọc file là operation phổ biến trong programming. Nên quen các methods và method nào efficient hơn. Trong bash, single task có nhiều ways nhưng luôn có optimal way và chúng ta nên follow nó.

Trước khi xem cách đọc file contents dùng while loop, quick primer về while loop. While loop evaluate condition và iterate over code set khi condition true.

while [ CONDITION ]
do
  code block
done

Phân tích while loop syntax:

  • while loop bắt đầu với while keyword theo sau condition.
  • Condition enclosed trong [ ] hoặc [[ ]]. Condition luôn return true để loop execute.
  • Code block thực tế đặt giữa do và done.
NUMBER=0
while [[ $NUMBER -le 10 ]]
do
  echo " Welcome ${NUMBER} times "
  (( NUMBER++ ))
done
Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất

Ví dụ đơn giản: loop executes cho đến khi NUMBER không lớn hơn 10 và in echo statement.

Cùng với while dùng read command đọc file line by line. Syntax kết hợp while và read. Có nhiều ways pass file as input, xem tất cả.

# SYNTAX
while read VARIABLE
do
  code
done

Piping trong Linux

Thường dùng cat command xem file contents từ terminal. Cũng pipe output của cat command đến commands khác như grep, sort, v.v.

Tương tự, dùng cat command đọc file content và pipe đến while loop. Demo dùng /etc/passwd file nhưng không advisable mess với file này, backup copy nếu muốn test.

cat /etc/passwd | while read LREAD
do
  echo ${LREAD}
done
Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất

Phân tích code trên:

  • cat /etc/passwd đọc file contents và pass as input qua pipe.
  • read command đọc each line passed từ cat command, store trong LREAD variable.
  • read command đọc file contents cho đến khi EOL interpreted.

Cũng dùng commands khác như head, tail pipe đến while loop.

head -n 5 /etc/passwd | while read LREAD
do
  echo ${LREAD}
done
Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất

Input Redirection trong Linux

Redirect file content đến while loop dùng Input redirection operator (<).

while read LREAD
do
  echo ${LREAD}
done < /etc/passwd | head -n 5
Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất

Cũng store filename vào variable pass qua redirection operator.

FILENAME="/etc/passwd"
while read LREAD
do
  echo ${LREAD}
done < ${FILENAME}
Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất

Cũng pass file names as argument cho script.

while read LREAD
do
  echo ${LREAD}
done < $1 | head -n 5
Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất

Internal Field Separator (IFS)

Làm việc với các file formats (CSV, TXT, JSON) và muốn split file contents dựa trên custom delimiter. Dùng "Internal field separator (IFS)" split content và store vào variables.

Demo cách hoạt động. Xem /etc/passwd file có colon (:) delimiter. Split mỗi word từ line store vào separate variables.

Ví dụ dưới split /etc/passwd với colon separator, store mỗi split vào different variables.

while IFS=":" read A B C D E F G
do
  echo ${A}
  echo ${B}
  echo ${C}
  echo ${D}
  echo ${E}
  echo ${F}
  echo ${G}
done < /etc/passwd
Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất

Chỉ hiển thị 1 line split trong screenshot do size.

Empty Lines trong Linux

Empty lines không bị ignored khi loop through file content. Demo: tạo sample file với content: 4 lines, vài empty lines, leading/trailing whitespace, tab chars line 2, escape chars (\n, \t).

Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất
while read LREAD
do
  echo ${LREAD}
done < testfile
Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất

Kết quả: blank line không ignored. Lưu ý cách whitespaces bị trimmed bởi read command. Cách đơn giản ignore blank lines: dùng test operator với flag -z check string length zero. Lặp lại example với test operator.

while read LREAD
do
  if [[ ! -z $LREAD ]]
  then
    echo ${LREAD}
  fi
done < testfile
Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất

Output: empty lines bị ignored.

Escape Characters

Escape characters như \n, \t, \c không in khi đọc file. Demo dùng cùng sample file có escape chars.

Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất
while read LREAD
do
  echo ${LREAD}
done < testfile
Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất

Output: escape chars mất meaning, chỉ in n và t thay vì \n và \t. Dùng -r flag prevent backslash interpretation.

while read -r LREAD
do
  echo ${LREAD}
done < testfile
Đọc File trong Bash: Kỹ thuật While-Loop Tốt Nhất

Đó là tất cả bài viết. Rất mong nghe feedback và tips từ bạn. Feedback giúp chúng tôi tạo content tốt hơn. Keep reading và keep supporting.