- PR -

bshにて文字列操作

投稿者投稿内容
やすけ
ベテラン
会議室デビュー日: 2003/08/20
投稿数: 87
投稿日時: 2007-01-17 19:39
nakamuraと申します。
bシェルにてあるパラメータファイルを参照してその文字列のある部分を
取得したいのですが、ネット等で調べたのですがいまいちよくわかりません。
どなたかご教授願いますでしょうか。
test.shからパラメータファイルtest.datを読み込み、その中の特定の文字列を
取得したいと考えています。
パラメータファイル:test.dat
test.datの中身
aaaaa/bbbbb
/の前までのaaaaaを取得したいと考えています。
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2007-01-17 19:47
¥と$は半角にして実行してください。
コード:
cat test.dat  | perl -pe 's/¥//¥t/g' | awk '{print $1}'


angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2007-01-17 19:59
こんにちは。
bash や ksh で良ければ、次のようなコードで。
コード:
while read LINE;

do
echo ${LINE%%/*}
done < test.dat



詳しくは、bash(1)の「パラメータの展開」をご参照ください。

訂正:
申し訳ない。リダイレクトの“<”を2つ重ねてしまいました。それでは別の意味になってしまいますね。1つに訂正しました。
それと、while の後のセミコロンは無くても良いので消しました。

[ メッセージ編集済み 編集者: angel 編集日時 2007-01-18 09:18 ]
やすけ
ベテラン
会議室デビュー日: 2003/08/20
投稿数: 87
投稿日時: 2007-01-17 23:46
温州蜜柑さん、angelさんレスありがとうございます。
パラメータファイルからaaaaa/bbbbbは取得できたのですが、
配列等に1文字ずつセットし、最終的にaaaaaにしてっていうのは
効率悪いでしょうか。
angelさんに教えていただいたとおりやったのですが、これ以降のシェルの中身が表示されてしまいます。なにかおかしいでしょうか。
#!/bin/sh

while read LINE;
do
echo ${LINE%%/*}
done << test.dat

echo "---------------------" >> test.log
echo " shell end " >> test.log
echo `date` >> test.log
echo "---------------------" >> test.log
上記をtest.shに書いて、実行するとこれ以降のシェルの中身(echo4つ)が
表示されてしまいます。
温州蜜柑さんのでやってみたらうまくいきました。もうひとつ温州蜜柑さんに
教えていただきたいのですが、これで取得した文字列を変数に入れる場合は
普通に
test=`cat test.dat | perl -pe 's/\//\t/g' | awk '{print $1}'`
でよろしいのでしょうか?

Ay
常連さん
会議室デビュー日: 2006/10/29
投稿数: 45
投稿日時: 2007-01-18 00:43
引用:

やすけさんの書き込み (2007-01-17 23:46) より:

温州蜜柑さんのでやってみたらうまくいきました。もうひとつ温州蜜柑さんに
教えていただきたいのですが、これで取得した文字列を変数に入れる場合は
普通に
test=`cat test.dat | perl -pe 's///t/g' | awk '{print $1}'`
でよろしいのでしょうか?


いいと思いますよ。
それで $test に取得したい文字列が全て格納されるはずです。

でも
コード:
cat test.dat  | perl -pe 's/¥//¥t/g' | awk '{print $1}'


よりも
コード:
perl -pe 's|/.*||' < test.dat



コード:
awk -F '/' '{print $1}' < test.dat


の方が良くないですか?^^;
温州蜜柑
ベテラン
会議室デビュー日: 2005/01/24
投稿数: 65
お住まい・勤務地: 東京都
投稿日時: 2007-01-18 01:39
引用:

Ayさんの書き込み (2007-01-18 00:43) より:
コード:
awk -F '/' '{print $1}' < test.dat


の方が良くないですか?^^;


これ、いいですね。勉強になりました。

やすけさん(nakamuraさんとお呼びすればいいのかな?)、こんばんは。
せっかくご指名いただきましたが、あいにく帰宅していました。
こっち( http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36114&forum=10&3 )の
投稿もみましたが、以下のようなシェルで要件を満たせますか?

コード:
#!/bin/sh
LOG_FILE=test.log
DAT_FILE=test.dat
BAR="---------------------"

if [ ! -f $DAT_FILE ]; then
	echo "$DAT_FILE is not found..."
	exit 1
fi

for LINE in `awk -F '/' '{print $1}' < $DAT_FILE`; do
	if [ -d $LINE ]; then
		echo $BAR "dir:" $LINE `date` $BAR >> $LOG_FILE
		find $LINE -type f >> $LOG_FILE
		echo $BAR >> $LOG_FILE
	fi
done

exit 0


angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2007-01-18 09:10
おはようございます。
引用:
やすけさんの書き込み (2007-01-17 23:46) より:
angelさんに教えていただいたとおりやったのですが、これ以降のシェルの中身が表示されてしまいます。なにかおかしいでしょうか。


失礼しました。リダイレクトの書式がおかしかった分を、上で修正しました。

で、“test.dat”の中の、“/”以前の部分 (各行) の後に、指定のメッセージを添えて、“test.log”に保存する、というのであれば、次のようなスクリプトで。
コード:
#!/bin/bash
exec >> test.log
while read LINE
do
echo ${LINE%%/*}
done < test.dat

echo '---------------------'
echo ' shell end '
date
echo '---------------------'

やすけ
ベテラン
会議室デビュー日: 2003/08/20
投稿数: 87
投稿日時: 2007-01-22 10:33
皆様、レスが遅れて申し訳ありません。やすけです。
追記ですが、このtest.datのパラメータファイルは複数行存在します。
なので、awk〜で取得すると、複数行すべて取得してしまうのです。
1行ずつ取得できないものでしょうか?

スキルアップ/キャリアアップ(JOB@IT)