Bash
ファイル(データストリーム、変数)を1行ずつ(および/またはフィールドごとに)読み込みますか?
サーチ…
パラメーター
パラメータ | 詳細 |
---|---|
IFS | 内部フィールドセパレータ |
ファイル | ファイル名/パス |
-r | 読み取り時にバックスラッシュの解釈を防止する |
-t | readarray によって読み込まれたreadarray から改行が削除されreadarray |
-d DELIM | DELIMの最初の文字が(と読まれるまで継続read )というよりも、改行、 |
ファイル(/ etc / passwd)を行単位で、フィールド単位で読み取ります。
#!/bin/bash
FILENAME="/etc/passwd"
while IFS=: read -r username password userid groupid comment homedir cmdshell
do
echo "$username, $userid, $comment $homedir"
done < $FILENAME
Unixパスワードファイルでは、ユーザー情報が行ごとに格納され、各行はコロン(:)で区切られたユーザーの情報で構成されます。この例では、行単位でファイルを読み込んでいる間に、IFSに指定された値で示される区切り文字としてコロン文字を使用して、行をフィールドに分割します。
サンプル入力
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin
サンプル出力
mysql, 27, MySQL Server /var/lib/mysql
pulse, 497, PulseAudio System Daemon /var/run/pulse
sshd, 74, Privilege-separated SSH /var/empty/sshd
tomcat, 91, Apache Tomcat /usr/share/tomcat6
webalizer, 67, Webalizer /var/www/usage
行ごとに読み込んで行全体を変数に代入するには、次の例を変更します。ここで言及されている名前行で変数が1つしかないことに注意してください。
#!/bin/bash
FILENAME="/etc/passwd"
while IFS= read -r line
do
echo "$line"
done < $FILENAME
サンプル入力
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin
サンプル出力
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin
ファイルの行を配列に読み込む
readarray -t arr <file
またはループを使用して:
arr=()
while IFS= read -r line; do
arr+=("$line")
done <file
ファイルを1行ずつループする
while IFS= read -r line; do
echo "$line"
done <file
ファイルに最後に改行が含まれていない場合は、次のようにします。
while IFS= read -r line || [ -n "$line" ]; do
echo "$line"
done <file
文字列の行を配列に読み込む
var='line 1
line 2
line3'
readarray -t arr <<< "$var"
またはループを使用して:
arr=()
while IFS= read -r line; do
arr+=("$line")
done <<< "$var"
行単位で文字列をループする
var='line 1
line 2
line3'
while IFS= read -r line; do
echo "-$line-"
done <<< "$var"
または
readarray -t arr <<< "$var"
for i in "${arr[@]}";do
echo "-$i-"
done
コマンドラインの出力を1行ずつループする
while IFS= read -r line;do
echo "**$line**"
done < <(ping google.com)
またはパイプで:
ping google.com |
while IFS= read -r line;do
echo "**$line**"
done
フィールドでファイルフィールドを読み込む
フィールド区切り文字がファイル・ファイルの :
コロン)であると仮定しましょう。
while IFS= read -d : -r field || [ -n "$field" ]; do
echo "$field"
done <file
コンテンツの場合:
first : se
con
d:
Thi rd:
Fourth
出力は次のとおりです。
**first **
** se
con
d**
**
Thi rd**
**
Fourth
**
フィールドごとに文字列フィールドを読み込む
フィールドセパレータが:
のようになっているとしましょう:
var='line: 1
line: 2
line3'
while IFS= read -d : -r field || [ -n "$field" ]; do
echo "-$field-"
done <<< "$var"
出力:
-line-
- 1
line-
- 2
line3
-
ファイルのフィールドを配列に読み込む
フィールドセパレータが:
のようになっているとしましょう:
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
arr+=("$field")
done <file
文字列のフィールドを配列に読み込む
フィールドセパレータが:
のようになっているとしましょう:
var='1:2:3:4:
newline'
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
arr+=("$field")
done <<< "$var"
echo "${arr[4]}"
出力:
newline
フィールドごとのコマンドフィールドの出力をループする
フィールドセパレータが:
のようになっているとしましょう:
while IFS= read -d : -r field || [ -n "$field" ];do
echo "**$field**"
done < <(ping google.com)
またはパイプで:
ping google.com | while IFS= read -d : -r field || [ -n "$field" ];do
echo "**$field**"
done
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow