シェルスクリプト総合@LINUX Part3at LINUX
シェルスクリプト総合@LINUX Part3 - 暇つぶし2ch116:login:Penguin
07/09/07 17:39:52 aiZtBudz
>>115
もう一回自分で書いてみたら?

117:login:Penguin
07/09/07 19:24:55 Txvf/Wl4
find /data -mindepth 1 -maxdepth 1 -type d -exec ...

shopt -s nullglob
for i in /data/{,.{[!.],.?}}*/
do ...

こんなんでいかが

118:login:Penguin
07/09/07 19:45:52 ezpNZgi5
cat hoge | awk
に似ている。

119:login:Penguin
07/09/07 20:30:25 BZSReuYl
>>116
OK。これでどうだ?
find /home/* -maxdepth 0 -type d


120:login:Penguin
07/09/08 04:46:18 WlyFgm6n
>>117 でもう答え出てるじゃん。

>>119
/home/.xxx/ とかが出ない。
* 使うなら find 使う意味ない。

121:login:Penguin
07/09/08 14:42:47 vllGfkN4
>120
>* 使うなら find 使う意味ない。
上下別々の回答なんじゃないの?

122:login:Penguin
07/09/11 03:08:21 997sWGjJ
bashrc の書き方もこのスレでいいですか?

123:login:Penguin
07/09/12 11:40:47 EatE1MlG
#!/bin/sh -f
ls *.dat > list.txt

なぜか走らん。

124:login:Penguin
07/09/12 17:16:53 A49nKXNq
>>123
子プロセスとして(?)起動するシェルに -f が渡らないんだと思う。
/bin/sh -f hoge.sh とか
あらかじめ /bin/sh -f で起動したシェルで
./hoge.sh みたいにすると
-f が有効になる。

125:login:Penguin
07/09/12 17:21:21 EatE1MlG
>>124
エラーで *.dat: ファイルもディレクトリもありません とでる
ワイルドカードが原因かと思ったけど、hoge*でも同様のエラー

シェルにしたら走らず、コマンドラインで直接投げたら走る
なんでだろ

126:124
07/09/12 17:27:12 A49nKXNq
>>125
/bin/sh -f の -f がどんな意味かわかってる?

あと、シェルとシェルスクリプトはちゃんと区別したほうがいい。

127:login:Penguin
07/09/12 17:33:44 EatE1MlG
!/bin/cshで走ったわ
コンソールがcshだった

128:login:Penguin
07/09/12 20:01:20 9HkBr7tD
複数のpasswdファイル(passwd_A、passwd_B)を結合して、同じユーザ名があった場合
passwd_Aのものだけを残すというようなことをしたいのですがどうすればよいでしょうか?

129:login:Penguin
07/09/12 20:12:55 nfcPR4Gc
いったんファイルを結合する
一行ずつ上から順に読んでパスワードファイルに書き込む
書き込んだらそのユーザー名を別ファイルに書き出す
その別ファイルにユーザー名がないことを確認してから
パスワードファイルに書き込めばよい

130:login:Penguin
07/09/12 22:19:22 qqfxe9V8
while read t ;do
if [ "`grep ^${t%%:*}: passwd_A`" ];then
continue
else
echo $t >>passwd_A
fi
done <passwd_B


131:login:Penguin
07/09/12 22:53:21 SML918nz
んだば awk で。
awk -F: '{
    t[$1] = $0;
}
END {
    for (e in t)
        print t[e];
}' passwd_B passwd_A

132:login:Penguin
07/09/12 23:49:46 lhLTsTba
awk -F: '!($1 in t){print;t[$1]=1;}' passwd_A passwd_B

133:login:Penguin
07/09/13 21:53:28 8j1+julM
aaa.txtの中身
20070109,170000,170000,167000,170000,4
20070110,168000,168000,168000,168000,10
20070115,171000,171000,163000,169000,500


2007/01/09,170000,170000,167000,170000
2007/01/10,168000,168000,168000,168000
2007/01/15,171000,171000,163000,169000
のように
YYYY/MM/DDと表示を変更する
最後の,からあとを削除してbbb.txtとして出力したいと思っています
どのようにすればいいものでしょうか

4文字目と5文字目の間に/を挿入するということがsedでできなくて悩んでおります
よろしくお願いいたします


134:login:Penguin
07/09/13 22:06:02 OVx1tSlg
cat /tmp/aaa.txt | gawk -F, '{printf("%04d/%02d/%02d,%s,%s,%s,%s\n", substr($0,1,4),substr($0,5,2),substr($0,7,2),$2,$3,$4,$5)}' > bbb.txt

135:login:Penguin
07/09/13 22:08:03 G9V8Phhb
\(\)でグルーピング、\{\}でマッチする回数の指定。
グルーピングしたパターンは後で\1,\2で参照出来る。
\を忘れるなよ。

136:login:Penguin
07/09/13 22:09:20 G9V8Phhb
あ、ごめん、>135はGNU sedの話

137:login:Penguin
07/09/13 22:25:32 8j1+julM
>>134
ありがとうございます
gwakというのも勉強してみようと思います





138:login:Penguin
07/09/13 22:52:13 8j1+julM
>>134
manを見てみたら いろんなところで使用できそうです
本当にありがとう

139:login:Penguin
07/09/13 23:24:02 saILvvtf
>>134
catは要らんだろ。

140:login:Penguin
07/09/14 00:50:00 uh85VpLs
正規表現も勉強した方がよろしいかと>>138

141:login:Penguin
07/09/14 12:28:52 hH9EcwDJ
ある XXX っていう名前を含んだプロセスを全て殺したい時、
ps aux | grep XXX | grep -v grep | awk '{print $2}' | kill
ではだめなのに
ps aux | grep XXX | grep -v grep | awk '{print $2}' | xargs kill
ではOKなのはなぜですか?

142:login:Penguin
07/09/14 12:34:24 18sjQ9F0
>>141
kill って標準入力を受け付けないんじゃない。
ところで pkill XXX じゃだめなの?

143:login:Penguin
07/09/14 12:37:30 hH9EcwDJ
>>142
そうなのかなと思って
for p in $(ps aux | grep XXX | grep -v grep | awk '{print $2}'); do
    kill "$p"
done
ってのもやってみたんですが、だめだったんですよ。

144:login:Penguin
07/09/14 17:32:35 Ney/3ygS
スクリプトでタイマー作れませんか?
一定間隔ごとに単純にコマンド出すだけじゃなくて
処理ごとに条件分岐してタイマーを止めたりコマンドが成功
するまで繰り返したりしたいのですが

145:login:Penguin
07/09/14 20:21:33 KxObz0sB
>>144
sleep使って、て程度で良いなら作れるような気しかしないんだけど、具体的にどうしたいのか書いたのが良いと思うぞ。

146:login:Penguin
07/09/14 20:32:43 RM0kquC+
>>144
どこまで出来たの?

147:login:Penguin
07/09/14 23:57:41 XHXILi6a
>>143
だめってどうダメだったのかわからんと。

for p in $(ps aux | grep smbd | grep -v grep | awk '{print $2}'); do
"kill "$p"
done

これでやったらちゃんと動いたよ。スクリプトの問題じゃなくて
単に権限がなくてkillできなかっただけでは?

148:login:Penguin
07/09/15 16:55:13 /cIKvz/T
>>147
さっきやってみたら出来た。。。

間違って mplayer を40個くらい起動してしまって、そこでそのスクリプトを
叩いたつもりだったんだけど、焦ってなんか間違ってたのかもしれない。

とりあえず今度からは xargs のほうを使うようにするよ。

149:login:Penguin
07/09/15 17:28:32 YiwEKkpX
いやだからpkill使えって

150:login:Penguin
07/09/15 17:49:23 X+i1f7J3
command | command みたいな

cat hoge.txt | grep piyo

書き方があるじゃないですか? cat hoge.txt で出力される標準出力をパイプかませて
その出力内容に対して grep piyo をかける と言うような。
これと
xargs ってコマンドがあるじゃないですか?その違いがよく分からないのですが・・。
cat hoge.txt | xargs grep piyo

みたいな?

151:login:Penguin
07/09/15 18:13:14 YiwEKkpX
「cat hoge.txt | xargs grep piyo」=「grep piyo `cat hoge.txt`」



152:login:Penguin
07/09/15 18:42:58 X+i1f7J3
>>151
ほぉほぉ・・・・

cat hoge.txt | xargs grep piyo が
grep piyo `cat hoge.txt`
と同じならば
cat hoge.txt | grep piyo

grep piyo hoge.txt

ん?なんか混乱してきた・・・イマイチはっきりと分からない・・・

153:login:Penguin
07/09/15 19:03:27 8eNJORpc
argっていうぐらいだから引数に展開してくれるのだろ
その場合hoge.txtの中身はファイル名でないとだめ

154:login:Penguin
07/09/15 19:15:07 jJyNjt7I
もう分かってるかもしれないけど、xargsは標準入力をコマンドライン引数に変換するだけ。
echo 'file1 file2 hoge' | xargs rm
 ↓
rm file1 file2 hoge

155:login:Penguin
07/09/15 19:47:59 X+i1f7J3
むぅ・・・

echo `file1 file2 hoge` | xargs rm

rm file1 file2 hoge
となるならば
echo `file1 file2 hoge` | rm

どう展開されるんですか? すみません、ほんと頭弱くて。

156:login:Penguin
07/09/15 19:51:39 YiwEKkpX
引数と標準入出力の区別がまだついてなくて、全部「入力」として
ごちゃまぜの段階でしょ?まずそれを考えてみるんだ>155

157:login:Penguin
07/09/15 23:18:03 +DsxitZ3
>>154の echo 'file1 file2 hoge' | xargs rm
>>155の echo `file1 file2 hoge` | xargs rm

どこが違うか理解してからにしろ


158:login:Penguin
07/09/15 23:25:38 PpA5ThvC
こんな初歩の初歩みたいなことに、どうしてそんなに高飛車になれるんだ。

159:login:Penguin
07/09/16 01:01:56 S5o7UTSR
初歩の初歩は自力で身に付けてから来てくれよ。

160:login:Penguin
07/09/16 01:06:18 BSYCrrV+
タコタコ

161:login:Penguin
07/09/17 04:16:34 nqz563FT
convmv -r -f sjis -t utf-8 * --notest
で、再帰的にカレントディレクトリ以下のファイル、ディレクトリ全てに対して
sjisからutf-8に変換をかけるコマンドを打ったのですが、sjisとeuc-jpが混在していて
convmvの仕様だと 1ファイルでも -f で指定した文字コード以外の文字コードのファイルが
存在した場合はそこで全ての変換処理が実行されなくなってしまいます。
違う文字コードの場合は除外して残りを全て処理してくれるオプションは無いかとman convmv
を読んで見ましたが、無いようです。
仕方が無いので、これをシェルスクリプトで実現したいと思います。
実際にやりたいコマンドは
convmv -r -f sjis -t utf-8 /data/* --notest で、これで変換できないファイルは
convmv -r -f euc-jp -t utf-8 /data/* --notest で、全てのeuc-jpとsjisをutf-8にする事です。

for TARG in `find /data | nkf -w8`
do
    convmv -f sjis -t utf-8 ${TARG} --notest
    convmv -f euc-jp -t utf-8 ${TARG} --notest
done

これで、sjisのファイルだろうがeuc-jpのファイルだろうが必ずutf-8になると思われますが
いけると思いますか? | nkf -w8 をかませているのは、こうしないとターミナルで見た限りだと
文字化けしたファイル名でそのまま表示されるので、これだと多分ファイルにアクセスできないだろう
との配慮から、ちゃんとしたファイル名で見えるようにしたつもりです。

162:login:Penguin
07/09/17 08:49:52 hnYIly1T
>>161
qkc最強伝説

163:login:Penguin
07/09/17 11:57:35 nqz563FT
>>162
URLリンク(hp.vector.co.jp)
これですよね?

しかしこれはconvmvとは全く別物のようです。

convmv => ファイル"名"の文字コードを変換する ←私はコレが必要
qkc   => テキストファイルの"中身"の文字コードを変換する ←これは違う・・・

なので使えないみたいです。

ちなみに >>161で書いたスクリプトを実際に動かしてみた所、LinuxサーバのCPU使用率が
100%になって固まっちゃいました。無限ループをしているかファイル名取得に失敗しているか
よく分かりませんがダメでしたOTL

164:login:Penguin
07/09/17 12:18:44 CDwJTqgj
よくわからんのだが、nkf -gで文字コードの判別してやりゃ良いんじゃねぇの?

165:login:Penguin
07/09/17 12:56:16 RA5G8Fdp
while ! convmv -f sjis -t utf-8 -r /data --notest ; do
convmv -f euc-jp -t utf-8 -r /data --notest
done
なんか、どうよ?
文字コード判定がいまいちなのか誤認してくれたりするので --notest とって、ざっと眺めてからやる事を推奨。


166:login:Penguin
07/09/17 13:00:08 85s13mgP
--notest 外して試してみればーじゃん。

167:login:Penguin
07/09/17 13:21:00 hplwR1nR
echo $RANDOM

で結果に乱数を返したいんですけど、
0~9までの一桁の結果のみ返したい場合の指定方法とかってありますか?

168:login:Penguin
07/09/17 13:53:15 MlIRuyKv
$RANDOM % 10

169:login:Penguin
07/09/17 15:09:07 nqz563FT
>>164
nkf はファイル"名"ではなくて、ファイルの"中身"についての文字コードを
調べるんですよね?テキストファイルに対して実行するとShift-JISと言う出力が得られ、
.exeファイル等に実行すると Binary と表示されました。
なので、これは全く別物です。

>>165
おお・・・
それはつまり
convmv -f sjis -t utf-8 -r /data --notest
で、元ファイルがsjisじゃなかったときは元ファイルがeuc-jpとして処理を繰り返すんですね。
しかしその場合、仮に1つでも元ファイルがsjisだった場合は?と言うか・・・

それ実行してみたのですが、無限ループに陥りました。何度も同じファイルを判定して
これsjisじゃないよ~って帰ってきます。

よくよく考えると -r /data で既に再帰的に繰り返す処理なのに、それをさらにwhileでループさせて
いるんですよね。二重ループ状態ですか。
while ! convmv -f sjis -t utf-8 -r /data --notest ; do
これで、とりあえず convmv -f sjis -t utf-8 -r /data --notest が実行される
→実行された時に1つでも違うファイルが存在していてエラー
→convmv -f euc-jp -t utf-8 -r /data --notest が実行される
→実行された時に1つでも違うファイルが存在していてエラー
またconvmv -f sjis -t utf-8 -r /data --notest が、最初にエラーで止まったファイルも含んで
最初から実行される>当然また同じファイルでエラーを起こす>convmv -f euc-jp -t utf-8 -r /data --notest が
また実行されてまたこれも最初から処理してしまう>これを永遠に繰り返して無限ループに陥る。
ダメみたいですOTL

>>166
--notestはずして試してみてますが、エラーで弾かれます。

170:login:Penguin
07/09/17 15:30:26 kUn2DAgf
>>169
いや、ファイル名のコードをnkfで調べりゃいいじゃん、てことだったんだけど。

171:login:Penguin
07/09/17 15:35:55 kUn2DAgf
念のため。
for T in `ls ~`
do
C=`echo "$T" | nkf -g`
echo $T,$C
done
ファイル名の文字コードを調べてると思うんだが。

172:login:Penguin
07/09/17 16:38:42 nqz563FT
>>170-171
違うと思うなぁ・・・。

>>171のスクリプト実行してみたけど
これは ls ~ で表示されるファイル名リスト全体、、、そうだなぁ、、例えば
a.txt
b.mp3
c.tar
d.gz
e.tar.gz

とか日本語も含むファイル名全てが列挙されると思うけど、それらのファイル名リスト
全体を1つのテキストファイルとみなして、テキストファイルの中身(つまりファイル名が列挙されてる)
に対して文字コード変換をかけた結果を echo で出力しているんじゃないですか?
だからnkf は ファイル"名"の文字コードを調べるんじゃなくて、あくまでもテキストファイルの中身
の文字コードを調べるんだと思いますが。それこそqkcみたいな動作?
convmvは全くそれとは性格が異なる物だと思いますが、、非常にこの辺ややこしい・・・。

173:login:Penguin
07/09/17 16:45:55 8vN1DPCo
なんでこんなに全然わかってないのに自信満々なのだろうか

174:login:Penguin
07/09/17 16:47:06 rlyHM/pf
>>161
>>164 の意見を採用して書いてみた。
for を while に変えたのは俺の趣味。

find /data | while read TARG ; do
 File=$( nkf -g <<< "$TARG" )
 case "$File" in
   Shift_JIS*) Code=sjis ;;
   EUC-JP*) Code=euc-jp ;;
UTF-8*) continue ;;
 esac
 echo "$File: Convert to $Code" ## お好みで
 convmv -f "$Code" -t utf-8 "$TARG" --notest
done

ファイル名程度の短い文字列だと nkf の文字コード判定の
精度はあまりよくないが、やらないよりはマシだろう。


175:login:Penguin
07/09/17 16:52:30 HxbR0j5A
文字コードが違うファイル名が混在しているディレクトリって。
どうしてそうなったかが気になる

176:login:Penguin
07/09/17 16:55:54 4XOwAbVo
ローカルで作ってSambaで作ってWebDAVあたりで作ってとやってしまうと
起きるな?>混在。

後はデータ中の文字列を元にファイルを作ったりすると、うっかり
混在状態になったり。

177:login:Penguin
07/09/17 17:22:02 kUn2DAgf
>>172
>>173と同意なんだが、想像の斜め上な方向に理解してるのね。と理解。
なして>>171を実行してみた上で>>172になるのかわからん。。。
つまり、>>172としては、「a.txt あ.txt い.txt」の3つのファイルがあると、
 a.txt, ASCII
 あ.txt,UTF-8(とか)
 い.txt,EUC-JP(とか)
てならず、
 a.txt,BINARY
 あ.txt,BINARY
 い.txt,BINARY
となった、てこと?

>>174
半角カナ使ってなけりゃ、それなりの精度なんじゃねぇかと思うんだけど、どうだろ。

178:login:Penguin
07/09/17 17:29:26 kUn2DAgf
>半角カナ使ってなけりゃ、~
↑勘違い。すま。

179:login:Penguin
07/09/17 19:31:50 nqz563FT
>>173
すみませんOTL。

>>174
そのスクリプト動かしてみたのたですが、 echo ${File}を加えて確認した所
ほとんどのファイルが ASCII と出力されていて、少しだけ Shift-JISという出力が得られました。
って事は?Shift-JISとASCIIが混在しているという事でしょうか?
と言うかそもそもASCIIっていったいどういう・・?
euc-jp sjis utf-8 の3種類しか基本的には知らなくていいと思っていたのですが、4つ目の文字コード
も混在している(というよりeuc-jpのファイルは存在しなくてsjisとASCIIの2つが混在?)と言う事でしょうか。
と言うか convmv --list してみたら asciiってあるし・・・・。

>>176
そうそう、さらにFTPも混ざったりssh + rsyncとかでファイル持ってきたりすると
もう今ぐちゃぐちゃになってて、UTF-8に統一したいんですよ。。。
>>177
.txtの拡張子のファイルは BINARYはでません。

ん?って事は nkf -g ではファイル"名"の文字コードを判別しているって事ですか?
で、その出力がASCIIとShift-JIS、その他としてはBINARYの3種類の状態(だと思う)の場合は
convmv -f ascii -t utf-8
convmv -f sjis -t utf-8
でそれぞれ変換かければいいのかな・・・。なんか難しすぎて頭痛くなってきたOTL。
でもなんか全面的に私が間違っていた感じがするので、その点については皆様方には
大変ご迷惑をお掛けしておりまして申し訳ありません。

180:login:Penguin
07/09/17 20:51:38 kUn2DAgf
>>179
なんていうか、なぁ。

ASCIIってのは日本語使ってなけりゃASCIIだわな。ちと語弊あるけど。「a.txt」とか。
で、オレの>>177で示したのは、>>174をオレ解釈したところ、
「a.txt」と「(UTF-8な)あ.txt」と「(EUC-JPな)い.txt」が混在してると、いっしょくたになったのが
コード判別にかかって、結局コード判別できなくって「BINARY」って判別されるってことか? と。
オレの説明わかり難かったとは思うけどな。

でもってnkf -gだが、たんに「入力された」のの文字コード体系を調べるだけであって、それが
「ファイルの中身」なのか「ファイル名」なのかは、どっちを指定、てか、nkfに入力したか、て
違いだけ。わかる?

ついでに日本語のファイル名がShift-JISだけなら、SJIS→UTF8に変換指定するだけでokやな。

そんなわけで、まちっと勉強しれ。

181:login:Penguin
07/09/17 21:22:34 rlyHM/pf
>>179
ああ、そういや ASCII を忘れてた。w
解説は >>180 を見てもらうとして、
それを踏まえて >>174 を改良すると、こんな感じかな。
後は自分で調べてみな。

find /data | while read TARG ; do
 File=$( nkf -g <<< "$TARG" )
 case "$File" in
   Shift_JIS*) Code='sjis' ;;
   EUC-JP*) Code='euc-jp' ;;
   ISO-2022-JP*) Code='iso-2022-jp' ;;
   ASCII*|UTF-8*) echo "$TARG: $File"; continue ;;
   *) echo "$TARG: $File: Not supported format."; continue ;;  
 esac
 echo "$File: Convert from $Code to UTF-8." ## お好みで
 convmv -f "$Code" -t utf-8 "$TARG" --notest
done

>>180
> 「a.txt」と「(UTF-8な)あ.txt」と「(EUC-JPな)い.txt」が混在してると
判定はファイルごとに行うからこれで「BINARY」にはならないはず。

「(UTF-8)あ(EUC-JP)い.txt」とか、複数の文字コードで構成された
ファイル名だと誤判定と言うか、期待通りにはならないと思う。

こういうのもきちんと判定したいのなら ack がお勧め。
こんなファイル名に出くわす事はまずないだろうけどな。w

182:login:Penguin
07/09/17 22:20:42 nqz563FT
>>180
なるほど、英数字だけの場合はASCIIなんですね・・。
では、 a.txt(ASCIIですよね) を convmv -f ascii -t utf-8 a.txt --notest
なんて有り得ないわけですよねぇ。
BINARYって判別されたのは 例えば vncviewer.exe とかのファイルです。バイナリファイルだし。。。
この結果を見て私は vncviewer.exe と言うファイル名自体は英数字のみなので ASCIIかと
思いますが、しかしvncviewer.exeのファイルの"中身"はBINARYなので、nkf ってのは
ファイルの中身を見てコードを判別して返してくれるんだなぁと思った次第です。
(nkf がファイル"名"を見て返してくれるのなら vncviewer.exeはBINARYではなくASCIIで
かえって来ないといけないからです。) でも nkf に対して何を入力するかによって
返してくるものは違うんですね。ファイル"名"をnkfに入力すればファイル"名"のコードが帰ってくるし
ファイルの内容を入力すればファイルの内容のコードが帰ってくると。
>>181
度々具体的なスクリプトを示して頂いて本当にありがとうございます。
しかしですね・・・よくエラーを見てみると no such file or directory が帰ってきてるんですよね・・・。
つまり find /data をした結果、文字化けしたファイル名が返ってくるわけじゃないですか。
その文字化けしたファイル名の場合、そのファイルにはアクセスする事が出来ないですよね。
文字化けしたファイルに唯一アクセスする手段があるとすれば、それは "*" を使う事ですよね。
だから for や while で1ファイルずつ処理するっていう最初のアイディア自体がそもそも不可能
だったと言う事に今更ながら気づきました。ほんと文字化け問題って大変ですね・・。
"*"を使うと言っても find /data/* だと結局1ファイルずつ文字化けしたものが帰ってくるので
ダメっぽいです。 convmv に 直接 * を渡す必要があるみたいで、そうすると混在している場合に
全く処理をしてくれなくて結局ダメと。。。参ったなぁ・・・OTL。
それと1つシェルスクリプトスレなのでお聞きしておきたいのですが
File=$( nkf -g <<< "$TARG" ) ←これなんですが、 <<< って何ですか?普通 < か << ですよね。
<<<は初めて

183:165
07/09/17 22:30:38 RA5G8Fdp
>>169
エラーの起こる直前までは変換してくれるのかと思ってた。
いらぬ時間をとらせてすまねぇ。
んで(w)、また懲りずに考えてみたんだが、nkf使うんだったら
find work/ -type f -exec sh -c 'FN="`dirname \"{}\"`"/"`basename \"{}\" | nkf -w`"; [ -f "$FN" ] || mv -v "`echo \"{}\"`" "$FN"' \;
とかいかが?

ディレクトリ含まれてないんだけど、含むと末端からやらないといけないからシェルスクリプトでやるのは面倒くさそうだなァ、と思って逃げたw


184:login:Penguin
07/09/17 23:04:07 nqz563FT
>>183
うぐぅ・・・・

そのfind 以下のスクリプト難しすぎて私には何をどうしているのかさっぱり分かりませんです。。
awkとか正規表現とかそこら辺全然知らないので、なんかそれっぽいコードに見えて読めないOTL。

ディレクトリを含まないって言うのも問題ですねぇ・・・。

例えばですが hoge.txt と piyo/ っていうディレクトリが存在していて、それぞれのファイル名
もしくはディレクトリ名の文字コードを知りたい場合はnkfではどのようにコマンド入力したらいいんですか?

ls -d piyo/ | nkf -g
nkf -g < hoge.txt
nkf -g | `ls -d piyo/`
nkf -g <<< hoge.txt
等など色々試してみましたが、文字コードが見えませんでした。

# convmv ももう少し気を利かせて --force オプションなんて作ってくれて処理できないファイルは
スキップして処理可能なファイルだけ全部処理するみたいな機能盛り込んでくれてれば助かったんだけどなぁ・・・。

185:login:Penguin
07/09/17 23:10:07 kLzbccVO
無理してシェルで書くより
perl かなんかで書いちゃった方が早い気がする。

186:login:Penguin
07/09/17 23:26:23 hplwR1nR
すいません、いろいろやってみたけど出来ないので教えてください。

aaaa,bbbb,cccc,"hoge,hoge",ddd,eee,ffff

みたいなCSVが有ります。
※カンマがある列は必ず「""」で括られています。

# cut -d, -f 4

とかでカンマが含まれる行を出力しようとすると 結果に「"hoge」とのみ出力されてしまいます。
本当は「"hoge,hoge"」が出力されてほしいのです。
「"hoge,hoge"」の出力結果を得るためにはどの様にすれば良いですか?


自分的には、
sedコマンドでいったんワークファイルwor.csvなどに「"hoge\,hoge"」と
エスケープシーケンスを追加してからcutコマンドを実行すればうまく行くような気がしているのですが、
sedをどのように記述して良いのかすら解りません(泣)


どなたか教えてください。。。。

187:login:Penguin
07/09/17 23:42:08 kUn2DAgf
実は混在なんかしてない、ていうことはないのんか? もしくはかなり偏っている。
なら、ある程度手作業でその他一括、のが楽かも知れん。

188:login:Penguin
07/09/17 23:45:48 msAJx7Dr
結局カンマ関係なしに""で括られたのが欲しいんじゃねぇのか?

189:login:Penguin
07/09/18 00:04:13 hplwR1nR
186です。

>>187

1000行近くのCSVファイルで確実に混在しています。
例えば、↓↓↓みたいな行です。
(「US」の後ろにカンマがありますよね?)

75,0,,,-,,-,"LOG3\.0.*123456 .....5.*\(US, 21\): NOTICE:.*",,,,,,,AAAA,BBB,"TEST",WARN,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,1,,,,,,,,,,,,,,,,,,,75


この行から特定の列だけ抜き出し&抜き出しした列を引数にコマンドを実行しています。

>>188

そんなことないです。
実際には初期値の列も多いので。

190:login:Penguin
07/09/18 00:16:17 u/C4qzX6
>>182
read に -r オプションつけたらどう?

旧) find /data | while read TARG ; do
新) find /data | while read -r TARG ; do
                 ^^^
> File=$( nkf -g <<< "$TARG" ) ←これなんですが
man bash のヒア・ストリングス (Here Strings) の項を参照。


191:login:Penguin
07/09/18 00:35:05 u/C4qzX6
>>189
う~ん、難しいね。
クォートされたエントリが一行に一つだけなら
↓で取り出すことはできるけど。

sed '/"/ s/.*\(".*"\).*/\1/'

俺なら一度 csv を Excel に放り込んでから
特定の列を抜き出すかな。w

192:login:Penguin
07/09/18 02:15:13 AGCqK3mV
sed -n 's/\(\("[^"]*"\)\|\([^,]*\)\)\(,\|$\)/\n\1\n/4;s/[^\n]*\n//;P'

sedでやってみた。


193:login:Penguin
07/09/18 07:39:01 +nqx9VGy
186です。
ありがとうございます。

191,192を実行してみたんですけど、正しく表示されませんでした(泣)

194:login:Penguin
07/09/18 12:30:11 Gq30BMp3
>>186
センス悪いけどこんなのでよければ
#!/usr/bin/gawk -f
BEGIN{n=ARGV[1];ARGV[1]=""}
function parse(s,c,f,i,j,k){
while(1){c=substr(s,i,1);if(c=="")return;else if(c=="\"")f=(f>0)?0:1
else if(c==","&&f==0){array[k++]=substr(s,j,i-j);j=i+1}i++;}}
{parse($0);print array[n]}

195:192
07/09/18 18:40:20 AGCqK3mV
/^o^\懽懽懽懽懽懽懽
自分の環境では、186と189は上手くいってるぽいんだが。

例えば、189は192の4の所を8にすれば
"LOG3\.0.*123456 .....5.*\(US, 21\): NOTICE:.*"
って出るし、15にすれば
AAAA
と、出る。

sedのバージョンと実データがどんなのか知りたい所。


196:login:Penguin
07/09/18 18:48:06 mMDRvNP8
>>195
スマソが懽の隣の文字のフォントが無いのだが
E3
5E
って表示になってる

197:login:Penguin
07/09/18 19:09:24 AGCqK3mV
半角カナで書いたら化けた模様w


198:login:Penguin
07/09/18 21:50:07 En+WDn3C
bashでスクリプトと組んでいる途中でつまづいてしまいました

~/tmp/ 以下にあるファイルすべてに対してファイル変換したいのです(例 aaaaa ⇒ aaaaa.txt)

~/tmp/aaaaa
~/tmp/bbbbb
:
~/tmp/nnnnn

=============
cd ~/tmp/
ls_result1=`ls`

for list1 in $ls_result1
do
#便宜上 (変換コマンド) (変換前) (変換後) とします
(変換コマンド) ~/tmp/$(list1) ~/tmp/tmp/$(list1).txt ←listの使い方が間違っているのだと思います
done
=============

list1 not found というエラーがたくさん出てきてしまい困っております。

~/tmp/ 以下にあるファイル名をそのまま使いたいので、どなたかご教授ください。


199:login:Penguin
07/09/18 22:05:47 9R+Y1frn
>>198
×(変換コマンド) ~/tmp/$(list1) ~/tmp/tmp/$(list1).txt
○(変換コマンド) ~/tmp/${list1} ~/tmp/tmp/${list1}.txt

200:198
07/09/18 22:15:47 En+WDn3C
>>199

できました♪ ありがとうございました m(_ _)m

201:login:Penguin
07/09/19 06:55:54 OLZv4Z+v
sed で/、\を多用できるようになりますたww
\tとか技も覚えますたww

みなさん㌧㌧!

202:198
07/09/19 12:51:22 OlaeIc6l
~/tmp/ 以下にある txtファイル だけファイルの中で置換したいのですが、
またつまづいてしまいました

# その前の処理で year month day hour という変数が与えられています
txtファイルの1行目 2007090100AB ⇒ year month day hour AB(変数の間のスペースなし、ABは固定文字列)
txtファイルの2行目 2007/09/01 ⇒ year/month/day

そこで以下のように作ったのですが、~/tmp/ に bakファイルが作られておらず、
echo $ls_result を見ると /home/myname/tmp/*.txt となっていました
想定では *.txt だったのですが・・・

=================
ls_result=`ls ~/tmp/*.txt`

for list in $ls_result
do
cp -p $list ${list}.bak

sed -e '1 s/2007090100AB/${year}${month}${day}${hour}AB/' ${list}.bak
sed -e '2 s/2007\/09\/01/${year}\/${month}\/${day}/' ${list}.bak

mv &{list}.bak $list
#rm -f ${list}.bak
=================

どなたか教えてください。よろしくお願いします。

203:login:Penguin
07/09/19 15:41:53 Ii4uF/l/
これではまともに動いてもbakファイルはないだろ

204:login:Penguin
07/09/19 18:36:32 42fTFu0H
>>202
これだと置換後のファイルを.bakに作って、そのあと出来た.bakをオリジナルに
重ね書き(しかもムーヴ)してるように見えるけど。

.bakとオリジナルの2個とも残したいなら、mvじゃなくてcpだろうね。

それ以前に、こういう処理だと普通は.bakに変換前のオリジナルを残すと思うが。

最初にオリジナルを.bakにcpしてあるんだから、.bakは触らずに、元のファイルに
sedかけて、最後のmvは不要では

205:198
07/09/19 20:34:50 OlaeIc6l
>>203-204
コメントありがとうございます
いただいたアドバイスどおり、bakにはさわらずにオリジナルでsedかけてみました

ところが、シェルを動かした後のファイルを見ると動かす前とまったく同じ状態でした。
タイムスタンプも動かす前と同じでした。

sedの使い方が間違っているのでしょうか。今一度教えてください。

=================
ls_result=`ls ~/tmp/*.txt`

for list in $ls_result
do
cp -p $list ${list}.bak

sed -e '1 s/2007090100AB/${year}${month}${day}${hour}AB/' ${list}
sed -e '2 s/2007\/09\/01/${year}\/${month}\/${day}/' ${list}

#rm -f ${list}.bak
=================

206:login:Penguin
07/09/19 20:37:21 NIZBsTRK
>205
sedは-iオプションを指定しないと結果を標準出力に書き出すだけだよ。

207:login:Penguin
07/09/19 21:25:46 gh8Zvftq
sed -i.bak -s \
-e "1s/2007090100AB/${year}${month}${day}${hour}AB/" \
-e "2s,2007/09/01,${year}/${month}/${day}," \
~/tmp/*.txt

で、よくね?


208:198
07/09/19 21:44:56 OlaeIc6l
>>203-204,206-207

207さんのとおりにしたら、想定どおりに動きました!
みなさんありがとうございました。m(_ _)m

ずっと調べてたらこんな時間に…
今からごはん作ります (^o^)/


209:login:Penguin
07/09/21 15:18:02 5N/Tidqv
ディレクトリーA(ファイルが入ってます)を
10/1~10/31の日付名でコピーしたいのですが
なんかいい方法無いでしょうか?

Zshだと cp -R  A 10[1-31]なんてできるのでしょうか?

210:login:Penguin
07/09/21 15:27:31 KLJI/R6G
>>209
for i in {01..31}; do cp -pR A A10$i; done

zsh と bash で挙動違うな。

211:login:Penguin
07/09/21 15:37:28 KLJI/R6G
>>209
< - > のことなら、ちょっと用途が違うよ。
こんなんやってみ。

% touch B2
% ls B{1..3}
% ls B<1-3>

212:login:Penguin
07/09/21 15:46:39 5N/Tidqv
>>210 ハヤッ! ありがとうございます!

ディレクトリーAにhoge01~100ってファイルを作ったときは
Zshでさらさら~って逝けたのですが
現在bash環境なのでそれなりに書かないといかんなと思いつつ
3行になってしまう、漏れの脳みそでした il||li○| ̄|_

1行でやりたかったww さすがです>>210様 1行でばっちりコピーできますた

213:login:Penguin
07/09/21 15:49:11 5N/Tidqv
>>211 すみません -じゃなくて..でした
なかなか参考になるスッドレですね
正規表現もきっちり覚えないといけませんねorz

214:login:Penguin
07/09/22 04:00:27 DSw3XQMb
for d in {01..31} ; do printf "%02d " $d; done

215:73ですが
07/09/22 22:02:55 TBL9KN2J
>>94
おくればせながらスクリプトが動くようになりました。
御指摘のとおりスペースの数などがあっていませんでした。

ありがとうございました。

216:login:Penguin
07/09/26 09:48:46 kfTmpMA+
時間の逆算っていい技ないですか?
やぱ現在時刻から60進法で計算したほうが早い?

現在時刻 21:24 残り時間 36分で22時  って感じ

で、やてみたい

217:login:Penguin
07/09/26 09:54:08 lgPbyfYB
>>216
coreutilsのdateを使う。

218:login:Penguin
07/09/26 13:11:02 kfTmpMA+
date --date xxmin とかできるのですね!!
しらなんだポカーン

>>217 ありが㌧クス

219:login:Penguin
07/09/26 14:13:45 kfTmpMA+
echo $((59 -` date  '+%M' | awk '{print $1}'` ))  $((59 -` date  '+%S' | awk '{print $1}'` ))

これでもでけた!

220:login:Penguin
07/09/27 18:47:27 Qh1DP+hx
date,sleep, atは使い込めばラーメンタイマーも・・・・・・・いやなんでもない

221:login:Penguin
07/10/02 23:24:08 57QYWA2W
ほしゅ

222:login:Penguin
07/10/09 18:07:07 lJCQFIXV
モデムをオンフックにするのに
今のところcuを使って対話的にATH0を
送っているのですが、これを
シェルスクリプト内で実行して
自動化する方法はありますか?

223:login:Penguin
07/10/09 23:58:35 rK7+VmTA
対話的といえば expect ぐらいしか思いつかないな

224:222
07/10/10 19:31:25 TchaYqjx
>>223
manを眺めましたが奥が深そうですね。じっくりと勉強してみます。
ありがとうございました。

225:login:Penguin
07/10/11 00:25:04 0rD2It5e
>>222
草の根BBSでもやるんかい?

226:login:Penguin
07/10/11 02:33:49 8ZTBNRII
モデムで思い出したが、ミャンマーで対外ネット回線が一時遮断されたって
報じてたじゃん。
こんなときにもなんとかなるよう在外公館にアナログモデムを常備してたりは
しないだろうか。

227:222
07/10/11 06:32:06 o32fDZEh
>>225
これまでCCT-98IIIのマクロで自動巡回してたんですが
Linuxにしたら使えなくなるそうなので・・・・。
って、いやそうじゃなくて、vgettyで留守電のテストを
やってたら回線をつかんだまま切れないことがあって
それを切断させたいわけです。

>>226
自分はいざというときのためにジャストシステム製の
音響カプラ持ってます。(処分してないだけかも)

228:login:Penguin
07/10/11 08:26:20 A6nFaf5V
kermitをperlで操作するnifty4uというパッケージが、前世紀にあった。
NIFTY フォーラム自動巡回スクリプトなので、CCT-98な人には改造が容易かも。

ダイアルアップpppスクリプトを書けば済むんじゃないかと思うけど、やったことないから分かりません。。。

229:login:Penguin
07/10/11 13:36:28 wykYuUw8
#!/bin/bash

cd /home/hogehoge

というシェルスクリプトを作成し、実行してみても、移動でき
ません。
ディレクトリを移動するにはどのようなスクリプトを書けばい
いでしょうか?

230:login:Penguin
07/10/11 13:41:47 wNnhF+3E
>>229
シェルスクリプトとバッチファイルは違う。
シェルスクリプトはシェル内で動作する子プロセスだ。

231:login:Penguin
07/10/11 13:44:37 wNnhF+3E
>>229>>230
一部訂正。
s/シェルスクリプトは/単純に実行したシェルスクリプトは/

解決方法は "source" 。

232:229
07/10/11 14:10:15 wykYuUw8
>>230>>231

ありがとう。今手元に環境がないので明日試してみます。

233:login:Penguin
07/10/11 18:43:47 KODaF1AT
>>232
shell.sh がシェルスクリプトのファイル名だとして
chmod a+x shell.sh で実行権限与えて
shell.shがあるディレクトリで
./shell.sh
したら移動するよ。

234:229
07/10/12 09:38:40 EbLcx1Gh
>>231
sourceやってみたら無事cd出来ました。
>>233
やってみたけど、上手くいきませんでした。

お二方ともありがとうございました。

235:login:Penguin
07/10/12 10:44:01 7zE2B01m
シェルプロンプトにコマンド名を叩き込んで実行すると、
子シェル(sh,cshなど)が新たに作られて、その子シェルがスクリプトを実行する。
で、スクリプトが終わるとその子シェルもろとも消えて親シェルに戻ってくる。
だから、シェルスクリプト内でcdしたり、環境変数をセットしても、その影響は
子シェルの中にとどまって、スクリプト終了と共に消えてなくなる。
cshのsourceやshの.(ドット)は、子シェルを作らないで自分の中でスクリプトを実行する。
だからcdやsetenv、exportの結果が、起動した親シェルに反映される

236:login:Penguin
07/10/12 11:22:55 5+kNLqtp
. の他に alias とか関数使う手もあるよ。

237:233
07/10/12 17:40:09 sUVuIX9s
>>234
ごめん!間違った。
./shell.sh じゃなくて
. ./shell.sh でした。
. を打って1個スペース空けて シェルスクリプトファイル指定。

238:login:Penguin
07/10/12 17:46:35 5+kNLqtp
>>237
なんで ./ を付けるの?

239:login:Penguin
07/10/12 17:59:22 +Kk0eMQd
Yeah!めっちゃホリデイ

240:login:Penguin
07/10/15 14:50:05 NjtHefoB
特定のURLを一定時間に読み込むシェルスクリプトをつくりたいのです。
今のところwgetを使ってwget URLリンク(hogehoge) をクーロンで動かす予定ですが
もっとスマートなやりかたはありますか?

241:login:Penguin
07/10/15 22:15:04 yaqxWPIK
>>240
それでいいんじゃね?

242:login:Penguin
07/10/15 23:35:58 6xnjJ9Cn
>>241
じゃあ1分に1回よりも高頻度(30秒に1回とか、15秒に1回とか) やりたい場合はどうすれば?

243:login:Penguin
07/10/16 00:24:31 7lwU6GvW
アタックしたいのか?

244:login:Penguin
07/10/16 01:36:38 IhGBMLbJ
>>242
wget URLリンク(...;)<)
するスクリプトを毎分実行するとか。

245:login:Penguin
07/10/16 08:18:30 a72PxkLH
>>243
アタックしたいわけじゃないですよ。
ただcronって最高でも1分に1回しか実行できないはずなので、それよりももっと短い間隔で
処理をさせたい場合とかどうするのかなぁとふと疑問に思ったもので。

>>244
なるほど・・。 しかし wget URLリンク(...)<) がくるから、タイミングと言うか場合によっては
30分に1回キッチリ実行されるとは限りませんね。31分かかって、その後実行されて
今度は29分後に実行されるみたいなズレ方はしますよね。

246:login:Penguin
07/10/16 08:26:34 IhGBMLbJ
>>245
バックグラウンドで実行するとか。
つーか、何分もかかる処理を30秒ごとに実行していいのか?

247:login:Penguin
07/10/16 11:46:31 wfMufGFC
cronはプロセスが無限増殖するのを抑えるために、同時実行数に制限があるので注意
Solarisだと、確か同時実行数が100個を超えるとそれ以降は時刻が来ても起動しなくなる
LinuxだとOOMキラーが動いて刈り取られるかもしれん

cronの起動間隔 ≒ プロセスの実行時間

となるような長めのプロセス、特に通信関係とかで長めのタイムアウトが発生しそうな
プロセスをcronに仕込むときは、注意したほうがいい

248:229
07/10/16 13:58:23 EtpWijek
環境が手元にないもので、遅レスになってしまいすみません。

>>235
なるほどです。ありがとうございました。
>>236
ありがとう。aliasでも出来そうでした。
>>237
.の後に続けて入力したところ、うまくcdできました。

>>238
素人なのでよく分かりませんが、実行ファイルを実行するときに付けるんでは?

それでは、みなさんありがとうございました。

249:login:Penguin
07/10/16 14:09:44 IhGBMLbJ
>>248
. shell.sh
でもいっしょだよ。
やってみ。

250:login:Penguin
07/10/16 17:45:32 a72PxkLH
./ を つけるのは カレントディレクトリのファイルを指定する為。

つけないと 環境変数 $PATH の中から該当する物が無いかを探してなかったら
エラー返すので。 カレントディレクトリのファイルを指定する時にいちいち
./ をつけるのが面倒だからって $PATH に ./ も含めてしまうとセキュリティホールになるので
やらないでね。

251:login:Penguin
07/10/16 17:50:59 IhGBMLbJ
>>250
>>249

252:login:Penguin
07/10/16 18:39:11 tU6zGUOB
シェルスクリプトで端末の現在の行数を得るにはどうしたらいいですか

253:login:Penguin
07/10/16 19:18:04 iHfKM46h
stty -a とかかな。

254:login:Penguin
07/10/16 19:45:06 tU6zGUOB
>>253
情報ありがとうございます。
行数を表示するだけでなくて、
シェルスクリプトの中で行数を変数に格納して、
なんらかの処理を行いたいと思っているのですが
何かうまい方法はありますでしょうか

255:login:Penguin
07/10/16 21:12:10 pdm4T3SF
>>254
ROWS=`stty -a | tr ";" "\n" | grep rows | sed "s/.*rows //"`

256:login:Penguin
07/10/16 21:36:05 tU6zGUOB
>>255
できましたありがとうございました。

257:login:Penguin
07/10/16 23:32:43 sWAUZpv3
$LINES じゃだめなの?

258:login:Penguin
07/10/17 04:58:42 d5Vjha9K
シェルスクリプトの中で$LINESがとれるとでも?

259:login:Penguin
07/10/17 10:00:57 9KXOUzKW
ROWS=`tput lines`
COLS=`tput cols`


260:login:Penguin
07/10/17 22:15:42 VuOM9tU/
eval `resize`
echo $LINES $COLUMNS


261:login:Penguin
07/10/18 12:39:19 fyMSNeWa
>>260
resize は X がインストールされていない環境では使えない。
xterm の付属物なので。

262:login:Penguin
07/10/23 17:14:39 OMh5qn/O
ちょっと相談に乗ってください。

日付.pc名.サイト名_access_log
ex)
20071023.pc-local01.hoge_access_log
20071023.pc-local02.hoge_access_log
20071023.pc-local01.hagehoge_access_log
20071023.pc-local02.testhoge_access_log

と言うログファイルをサイト名別のフォルダに移動した後
1つのログファイルにマージさせるスクリプトを書きたいのですが。
とりあえず、スクリプト書いてみたのですが正直何がなんだか
分かりません。アドバイスを下さい。


#!/bin/sh
timestamp=`date +%Y%m%d`
log=`find /home/hoge/log -name $timestamp.*`
list=`echo "$log" | sed -e 's/_access_log//g' | cut -c57-`

スクリプトでは、今日のタイムスタンプを取ってlogファイルを検索し
その結果のサイト名以降の”_access_log”を消して、サイト名より前
も入らないので、表示させないようにする。これから、サイト別にフォルダを
作ってそこに移動させるのですが、mkdir "$list"では上手く行きません。
何かいいアドバイスを教えてください。よろしく御願いします。

263:login:Penguin
07/10/23 17:19:48 4jX2ZQqu
>>262
cut -c57- ってのは何?

264:login:Penguin
07/10/23 17:20:31 XqFIvlF4
>>262
シェルスクリプト以前の話だな。
まずは最終的に何をやりたいのかをはっきりしろ。

265:login:Penguin
07/10/23 17:26:06 4jX2ZQqu
>>262
$log にたくさんファイル名が入ってるのに
echo $log をいじろうとするのがよくわからんな。

>>264
まずは日本語の勉強からだな。

266:login:Penguin
07/10/23 17:50:56 OMh5qn/O
>>263
サイト名だけの文字を取りたかったので、cut -c57- としました。

>>264
申し訳御座いません。
ログファイル名からサイト名だけを文字を取り出して、取り出した文字
(サイト名)のフォルダを作って、作ったフォルダにそれぞれログを
振り分けてログファイルをマージさせたいです。
これで、少しは伝わりますでしょうか?

>>265
$logの結果からサイト名の文字だけ取りたかったので、echo $logを
いじっています。

267:login:Penguin
07/10/23 18:08:13 XqFIvlF4
>>266
プログラミングの論理部分を勉強したほうがいい。
「やりたいこと」と「実際のスクリプト」の間には
「ロジックを組み上げる」作業が必要になるが、
君はこの部分について全く理解できていないようだ。

まずは
「findで検索したファイルの一覧はどういう形で変数logに入っているのか」
「その変数logに対して繰り返し処理を行なうにはどうしたらよいか」
を調べてくるべし。

268:login:Penguin
07/10/23 18:09:14 4jX2ZQqu
そもそも find でうまくいかんな。

269:login:Penguin
07/10/23 18:17:19 OI+rqPpl
>>262
find . -type f -printf %f\\n|awk -F. '{gsub(/_access_log/,"",$3);print $2 "." $3}'|uniq >hostlist
for i in $(cat hostlist);do mkdir $i;done
あとawkで同じように
cp 20071023.pc-local02.testhoge_access_log pc-local02.testhoge
のようなlist作って実行

270:login:Penguin
07/10/23 18:18:51 OMh5qn/O
>>267
アドバイスありがとうございます。
正直、インフラ担当なのでプログラムさっぱりです(;´Д`)
とりあえず、ググって調べてみます。

>>268
もう少し調べてから、スクリプト書き直します。
ありがとうございました。

271:login:Penguin
07/10/23 18:20:53 OMh5qn/O
>>269
ありがとうございます。
参考にさせて頂きます。とりあえず、スクリプト周りを調べて
書いてみます。

272:login:Penguin
07/10/23 18:25:49 4jX2ZQqu
#!/bin/sh
cd /home/hoge/log
for i in `date +%Y%m%d`.*; do
dir=`echo $i | cut -f2 -d.`
[ -d $dir ] || mkdir $dir
mv $i $dir
done

ファイル数が多過ぎるとかヘンなファイル名とかは知らね。

273:login:Penguin
07/10/27 10:44:25 mm4VeEeL
IPアドレスを16進に変換したいです。
どうやりますか?

274:login:Penguin
07/10/27 13:17:13 D/VUEDKM
echo '192.168.0.1' | gawk -F. '{printf("%02x%02x%02x%02x\n", $1, $2, $3, $4)}'

275:login:Penguin
07/10/27 13:26:52 QMQXG4ov
>>274
俺のIPサンプルに使うなよ。晒されたら攻撃の的になるだろうが(´・ω・`)

276:login:Penguin
07/10/27 13:35:53 6kGxUA5U
>>274
ありがとうございました。

277:login:Penguin
07/10/27 14:33:40 NSYPc3Nw
>>275
ネットに繋がらないと思ったらお前のせいかー!
早く俺のIP返してくれよ(´・ω・`)

278:login:Penguin
07/10/27 15:34:59 XQQiaIjq
>>275
そうか、そんなにお望みなら今から的にしてやるよwww
タシロ砲とブラスターとあと手持ちの攻撃ツールの標的IPを全部セットして攻撃開s


279:login:Penguin
07/10/27 19:24:46 OFawlVSO
俺のIPは127.0.0.1だから攻撃するなよ

280:login:Penguin
07/10/27 21:20:28 jIwdHtQL
ひどいネタスレと化してるなココwwwwww

281:login:Penguin
07/10/29 10:48:36 AXA/ueYo
俺のIPは172.31.0.1だぞ。

282:login:Penguin
07/10/29 10:55:37 PqFYrP+5
もういいよ。

283:login:Penguin
07/10/29 11:01:37 F/RFN0ba
俺のIPは203.・・・・

いややめとく

284:login:Penguin
07/10/29 18:16:52 lN+2vPd7
じゃあオレも1個

オレのIPは
169.254.88.24だぞ。

285:login:Penguin
07/10/29 20:28:52 vqPZDaQA
あ、思い出した。
255.255.255.255 -> 0xffffffff
のように、IPv6表記を16進表記に変換する手続きを考えてくだちい。
f000::1 -> 0xf0000000_00000000_00000000_00000001 ("_"は不要)
ff::169.254.88.24 -> 0x00ff0000_00000000_00000000_a9fe5818

286:login:Penguin
07/10/29 23:28:48 Hdkrl+3D
完全に他人まかせだなぁ。
> ruby -rsocket -e 'p Socket.gethostbyname("ff::169.254.88.24")[3].unpack("C16").map{|c|format "%x",c}.join'
"00ff00000000000000000000a9fe5818"

287:login:Penguin
07/10/30 21:40:02 Hmkhn1Qf
あー、目鱗。
gethostbyname()等を使えばいいのか。

288:login:Penguin
07/11/06 00:15:33 vKEt0xzk
あるコマンド(hoge)の結果が・・・

(カラム位置) [col1 col2 col3 col4]
(コマンド出力) 0001 0002 * 0004

である場合にこの結果をset `hoge`で受けた場合、位置変数
$3に「*」が入ってくるようにbashのスクリプトを作成したい
のですが現状ではどうやってもカレントディレクトリ配下の
ファイル一覧が入ってきてしまいます。

何か良い手がありましたら教えて下さい。

289:login:Penguin
07/11/06 00:55:19 M5wBEVHJ
"`hoge`"

290:login:Penguin
07/11/09 03:25:37 r4+4tELy
>>289
オイオイ!w
マジレスすると
$ set -o noglob
じゃないの

291:login:Penguin
07/11/09 06:12:20 BEUM5jSj
>>300
zenity を使うとシェルスクリプトで手軽な GUI が作れるぞ

292:login:Penguin
07/11/09 08:21:31 kDM6jkym
URLリンク(www.google.co.jp)
でトップに出て来るページは、もしかしてケンカを売ってますか?
>最新のGnomeデスクトップを使っていても古いUnixユーザーはすぐにターミナルエミュレータを開いてしまいがちです。

293:login:Penguin
07/11/09 12:05:22 ei55nGr2
文章全体から見てポジティブな物言いだと思うが...

294:login:Penguin
07/11/10 01:20:06 5ErO5tFm
zenity の使用例: jpg と mp3 をあわせて avi を出力するスクリプト
音声ファイルをビデオホスティングサイトに投稿時に使用

====================================
#!/bin/sh
# mp3jpg2avi.sh

JPG_FILE=`zenity --title="JPG ファイルを選択してください" --file-selection`
MP3_FILE=`zenity --title="MP3 ファイルを選択してください" --file-selection`
zenity --title="質問" --question --text "変換開始しますか?"
if [ $? = 0 ];
then
 ffmpeg -shortest \
  -loop_input -f image2 -i $JPG_FILE \
  -i $MP3_FILE \
  -sameq output.avi
fi
====================================

295:login:Penguin
07/11/10 09:47:24 9Zj/zooJ
>>292
Linuxから入った人だけど、Gnomeなんてマルチウインドウ端末エミュレータ支援ソフト西か見えません

296:login:Penguin
07/11/10 11:07:23 vw7Wu+HW
マルチウインドウ端末エミュレータ支援ソフト西やら
マルチウインドウ端末エミュレータ支援ソフト力石やら
マルチウインドウ端末エミュレータ支援ソフトホセ=メンドーサやら知らん。

297:login:Penguin
07/11/10 11:19:14 9Zj/zooJ
>>296
一応ここでタオル投げときますね。つ~

298:login:Penguin
07/11/10 18:43:49 Skjd8N2z
そういやこの間表参道歩いていたら、
胸にでっかく

「マンモス西」

と書かれたTシャツを着たガイジンが
前からいきなり歩いてきてビビった。

東京は怖い街だよ。

299:login:Penguin
07/11/10 19:19:41 PRddAKpB
そんなアナタに
URLリンク(engrish.com)

300:login:Penguin
07/11/10 20:24:35 Skjd8N2z
そこのこの写真に、"Photo courtesy of Paul Gilbert"ってあるけど、
あのポールギルバートなんだろうか?

URLリンク(www.engrish.com)

日本に住んでたしなあ。

301:HhMiKdKNVb
07/11/12 01:38:17 J0HpIKvZ
hlUotX <a href="URLリンク(jtpkztrjwlma.com) [url=URLリンク(ykcooubrqrga.com) [link=URLリンク(tvapeckiqvbf.com) URLリンク(cygdvmjubaqg.com)

302:login:Penguin
07/11/13 02:33:43 tnRwnYpT
恥を忍んで質問なのですが

/home/me/ 以下にjpgファイルが数千有ります
中身はこんな感じなのですが
1082053423922.jpg
1082053508305.jpg
1082053537535.jpg
1082053614971.jpg
1082053699948.jpg
1082053732609.jpg
1082053763346.jpg
1082391828601.jpg
1082392563669.jpg
1083091232922.jpg

この数千の*.jpgのファイルをディレクトリから読み込んで以下タグの中にディレクトリから読み
インクリメンタルに全ての画像ファイルがリンク代入された状態で出力したいと思っています

<div id="myGallery">
<div class="imageElement">
<h3>Item 1 Title</h3>
<p>Item 1 Description</p>
<a href="mypage1.html" title="open image" class="open"></a>
<img src="images/foo/a.jpg" class="full" />
<img src="images/foo/a-thum.jpg" class="thumbnail" />
</div>

ディレクトリから読み込んだfileの名前a.jpgににファイルの中が無くなるまで
置換したいという意味なのですが..
どうか、助言願えないでしょうかm(__ __)m

303:login:Penguin
07/11/13 07:47:54 xB6HVDtO
まずは「この数千の……」以降の文章を推敲して他人に理解できるよう
書き換える。

304:login:Penguin
07/11/13 10:11:50 VZT+kd7x
>>302
zphoto でも使ったら?

305:login:Penguin
07/11/13 12:34:27 v1//zET/
こういうことか?

for f in `ls -1 /home/me`                         ; do echo '<img src="images/foo/'$f'" class="full" />'; done
for f in `ls -1 /home/me | gawk '{gsub("\\\.", "-thum.");print}'` ; do echo '<img src="images/foo/'$f'" class="full" />'; done

306:302
07/11/13 14:02:39 tnRwnYpT
>>303
深夜に回転数が落ちていまして申し訳ないですm(_ _)m

>>304
それも考えたのですが、出来ればこちらの方が良いなと思いまして..

>>305
バッチリ書き出せました、もの凄い感謝なのですが
thumとthum無しのイメージが交互に書き出すことが出来ると思います
教えていただいた物を各ディレクトリに置き換えたものが以下の物なのですが

for f in `ls -1 /www/web_dir/photo_album/images/foo/`; do echo '<img src="images/foo/'$f'" class="full" />'; done
for f in `ls -1 /www/web_dir/photo_album/images/foo/ | gawk '{gsub("\\\.", "-thum.");print}'` ; do echo '<img src="images/foo/'$f'" class="full" />'; done
1行目と2行目を並べて出力できるように努力したのですが...
gawkの部分で引っかかってしまいます、というか1行目しかループしてくれません(T.T)
補足いただければと思うのですが、よろしくお願いします マジ感謝感激です
shell sciptとawkの本もamazonしようと思っています

307:302
07/11/13 14:19:58 tnRwnYpT
もうちょっとで出来そう...

308:302
07/11/13 15:05:30 tnRwnYpT
出来ました ありがとうございましたm(__ __)m

309:login:Penguin
07/11/13 15:14:48 MuKLiZO1
最終的にどうやりましたか?
報告して下さい。

310:302
07/11/13 15:32:02 tnRwnYpT
ディレクトリを作りthumnail入れてこれで出力できました

for f in `ls -1 /www/web_dir/photo_album/images/foo/`;

do
echo '<div id="myGallery">';
echo '<div class="imageElement">'
echo '<h3>Item 1 Title</h3>'
echo '<p>Item 1 Description</p>'
echo '<img src="images/foo/'$f'" class="full" />';
echo '<img src="images/foo-thum/'$f'" class="full" />';
echo'</div>';
echo ' ';

done

311:login:Penguin
07/11/13 15:42:18 MuKLiZO1
ちなみにサムネールは thumnail じゃなくて thumbnail ね。

312:302
07/11/13 16:02:23 tnRwnYpT
はい、ありがとうございました^^

313:login:Penguin
07/11/13 18:23:44 v1//zET/
>>306
ls -1 /www/web_dir/photo_album/images/foo/ | gawk '{gsub("\\\.", "-thum.");print}'

ここだけ実行するとどうなるの?

314:login:Penguin
07/11/16 18:50:01 q8UeZNS0
ls -d /a/b/c/d/*/

のようにコマンドを打ち込むと
/a/b/c/d/hoge1
/a/b/c/d/hoge2
/a/b/c/d/hoge3
のように出力が帰ってきますよね。この中から
hoge1, hoge2, hoge3 の部分のみ、つまり ディレクトリ階層の一番深い部分のディレクトリ名
のみを得る為にはどうすれば良いのでしょうか?シェルスクリプト内で必要なのですが
分かりません。教えてください。

自分で調べた限りだと basename とか dirname がそれに近そうだったのですが、
ちょっと違うようです。他には見つけることが出来ませんでした。

315:login:Penguin
07/11/16 18:54:10 PPFIsM3H
>>314
> のように出力が帰ってきますよね。
いいえ。

316:login:Penguin
07/11/16 19:44:27 q8UeZNS0
>>315
/a/b/c/d/hoge1
/a/b/c/d/hoge2
/a/b/c/d/hoge3

じゃなくて

/a/b/c/d/hoge1/
/a/b/c/d/hoge2/
/a/b/c/d/hoge3/

の間違いでした。 このリストから hoge1, hoge2, hoge3を抜き出したい。
hoge1/ の最後の "/" も切り落としてしまいたいのですが、どうすれば良いでしょうか?

317:login:Penguin
07/11/16 19:51:40 PPFIsM3H
>>316
sed なり awk なりで切り出せると思うけど、
最初から
find /a/b/c/d -mindepth 1 -maxdepth 1 -type d -printf "%f\n"
とかじゃだめなん?

318:login:Penguin
07/11/16 20:01:17 gAB+KHmJ
>>316
for i in ls -d /a/b/c/d/*/; do basename $i; done


319:login:Penguin
07/11/16 20:10:36 PPFIsM3H
>>318
for i in `ls -d /a/b/c/d/*/`; do basename $i; done
と言いたいんだろうが、
for i in /a/b/c/d/*/; do basename $i; done
でいいな。
空白とか入ってなければ。

320:login:Penguin
07/11/16 20:14:17 q8UeZNS0
>>317
レスありがとうございました。
しかしfindコマンドに詳しくない為自分ではよく分かりません。それ・・・。

>>318
レスありがとうございました。
こちらの方法はまさに私が求めていた方法です。非常に分かりやすくて助かります。
本当にありがとうございます。

321:320
07/11/16 21:33:37 q8UeZNS0
解決したと思ったのですが、

ROOT=/a # ←ココは何でもいい、とにかくディレクトリ
cd ${ROOT}

for DIR in `ls -d ./*/`
do
for TARG in `basename ${DIR}`
do
echo ${DIR}
echo "${TARG}"
done
done

といった感じにしてみたのですが、
Venus7.0 Personal Edition
といったディレクトリが
Venus7.0 と Personal と Edition の3つに分割されてしまい、そのディレクトリに対して
処理したいのに3つの存在しないディレクトリに対して処理しようとする為、 no such file or directory
エラーが次々と帰ってきました。
どうも ディレクトリ名に半角スペースが入っているのがダメなようです。解決策はありませんか?
ちなみに全角スペースの場合は1つのディレクトリとして正常に動作しています。

for DIR in `ls -d ./*/`   ←この部分で分断されてしまっていると思いますが
for DIR in `ls -d ./"*/"`  などと" " で囲んで見ましたが */ なんてディレクトリは見つからない
と怒られました。 ' ' で囲んでも同じ結果です。どうしたら半角スペースをセパレータとして
認識するのを防げますか?

322:login:Penguin
07/11/16 21:43:34 lBcVe9Af
なんでそんなディレクトリがあるのか
を考えたほうが根本的な解決になりそう

323:login:Penguin
07/11/16 21:44:56 PPFIsM3H
>>321
だから >>319 で言ったじゃん。

>>322
いや、あるときはあるでしょ。
そんなにおかしいことではない。

324:login:Penguin
07/11/16 22:02:10 lBcVe9Af
わざわざ_使ってる人の意味を考えよう
>>321は''の囲み方が間違ってるだけだが
_があるのが普通って考えたほうが手間なくていい
windowsがらみならwindowsでやったほうがいい

325:320
07/11/16 23:35:30 q8UeZNS0
>>322
ま、まぁ色々事情がありまして。あるんですよ。。。

>>323
>>319の事かと思ってレスを投稿する前に確認したのですが、

for DIR in ./*/
do
    for TARG in `basename "${DIR}"`
    do
        echo ${DIR}
        echo ${TARG}
    done
done

で確認したところ 変数DIRには正しく取れました。 しかし
`basename "${DIR}"` としているにも関わらず
元ディレクトリ名 AVG Anti-Virus Free Edition 7.3
実行結果
AVG
Anti-Virus
Free
Edition
7.3
とこのように分断されてしまいます。 " " で囲っているにも関わらず、です。
何がいけないのでしょうか?

326:login:Penguin
07/11/16 23:59:15 2bsqELIP
#!/bin/sh

LIST="\"space aaa\" \"bbb\" \"space ccc\" \"ddd\"";
echo $LIST; # "space aaa" "bbb" "space ccc" "ddd"

func(){
echo "arg= $#"; #6
echo "$1"; # space
echo "$2"; # aaa
echo "$3"; # bbb
echo "$4"; # space
echo "$5"; # ccc
echo "$6"; # ddd
}

func $LIST;

上のようなスクリプトで
func には、"space aaa" みたいにスペースの入った引数を渡したいんですが、
なにか方法はないでしょうか? この場合funcにわたす引数を4つにしたいんです。
展開されて、引数が6つになってる。。。素人ですません。

327:login:Penguin
07/11/17 00:44:46 X3VLuMy8
>>325
for TARG in `basename "${DIR}"` ->
for TARG in AVG Anti-Virus Free Edition 7.3


328:login:Penguin
07/11/17 07:31:23 FrK+lOPY
>>326
$LIST をクォートする。

329:login:Penguin
07/11/17 08:31:04 tPTtgwaW
>>328
これだけで良かったんですね。
3時間くらい悩んでたよ。㌧

330:login:Penguin
07/11/17 09:32:44 X3VLuMy8
つeval

331:320
07/11/17 10:54:12 oelt9+66
>>327
レスありがとうございます。

そうなんですよ、そんな風に展開されてしまうんですよ。
${DIR} だけを出力しても
./AVG Anti-Virus Free Edition 7.3
となるのに
"${DIR}" とダブルクォートで囲っても
./AVG Anti-Virus Free Edition 7.3
と全く同じ出力になってしまう。つまりダブルクォートが利いてない・・。
だからそれをどうすれば1つの文字列として扱えるのですか?空白を区切りとしないようにする為には・・・。

332:login:Penguin
07/11/17 12:01:58 dajSe2oX
>331
basename の結果が正しいんだからダブルクォートは効いてるだろ?
その後、`` で置き換えた時には既に "${DIR}" とは無関係の文字列なんだから
直書きされてるのと同様に空白で分割されてるだけ。

あえて書くなら

for DIR in ./*/
do
    BASE=`basename "${DIR}"`
    for TARG in "${BASE}"
    do
        echo ${DIR}
        echo ${TARG}
    done
done

っていうか、なんで 2 段で for を回す必要があるのか。

333:login:Penguin
07/11/17 12:23:43 dh2GLbwy
>>331
バッククォート内はコマンドの出力に置き換えされるんだから、その出力を
クォートすればいい。
for TARG in "`basename "${DIR}"`"

っていうか、なんで 2 段で…


334:320
07/11/17 22:43:03 oelt9+66
>>332-333
な、なるほど・・・・
お二人の解説文を10回ほど読み直しながらじっくり考えてみた所、ようやく理解できました。
特に "`basename "${DIR}"`" はややこしくて 最初は何をかいているのだろうかと思いましたが
`basename "{DIR}"` の出力結果そのものを " " で囲っているわけですね。なるほどなるほど。
う~ん、これは思いつかない・・・。発想力ですか・・・。

で、2段でfor回していますが、確かに冷静に考えると2段で回す必要はありませんね・・・。
むしろ2段で回す処理にしている事で複雑化してしまった感があります。
1段forでいけそうです。

335:login:Penguin
07/11/23 15:28:58 P7OyMgNI
>326です。
拡張が必要になり、問題が増えました。

#!/bin/sh
echo $LIST; # "aaa aaa" "bbb" "ccc ccc ccc" "ddd"

func(){
~処理~
}

func "eee eee" "fff fff" "$LIST" "ggg ggg";

以下のようにfuncにスペースを含んだ形で
${LIST}とその他の値を同列に引数として渡したいのです。

↓funcに渡したい引数
"eee eee" "fff fff" "aaa aaa" "bbb" "ccc ccc ccc" "ddd" "ggg ggg"

>>328 >>330にあったように eval func で展開すると
LIST以外の引数がスペースで展開されてしまいます。

LIST以外の引数を "eee\ eee" とか"\"eee eee\""とする手で回避も可能ですが、
修正箇所が増えるので、極力この形は取りたくありません。
なにか方法はありませんか?

336:login:Penguin
07/11/23 22:55:10 rrMjYG9S
Σ^)/アホーアホー☆ミ-

337:login:Penguin
07/11/23 23:18:09 OSmgQwJo
uniqはsortしておかないとだめですが、
sortしなくても2回目意向の重複を削除するコマンド内ですか?

338:login:Penguin
07/11/23 23:25:42 KoVu18yL
some | command | perl -ne 'print unless $seen{$_}++'


339:login:Penguin
07/11/24 02:54:03 Qc2k01yB
>>335
func をスペースを分割しないで処理するようにして、
func に渡す前に "$LIST" だけ分割しちゃえば良いんじゃないの?


340:login:Penguin
07/11/24 13:44:38 3ItHeK84
>>338
おおおお、できました。ありがとうございました。

341:login:Penguin
07/11/24 15:57:48 uBYpiRKV
From - Fri Nov 20 14:53:45 2007
From: "Jfda dsadsada" <fdsfdsa@thdsadaer.de>
From - Fri Nov 21 14:53:45 2007
From: "rwerw dfsa" <sfdaf@fdfds.com>
From - Fri Nov 23 14:53:45 2007
From: "a bcd" <d@dfds.com>
From - Fri Nov 23 14:53:46 2007
From: "abc" <abc@abc.net>

このようなテキストの中から、日付に対応したアドレスだけをテキストに出力するにはどうしたらいいのでしょうか?
11月20日が指定されたらfdsfdsa@thdsadaer.deを出力
11月23日が指定されたらd@dfds.comとabc@abc.netを出力といった具合です

342:login:Penguin
07/11/24 16:23:59 bvlPAES0
grep -A1 "Nov 20" | grep -o "<.*@.*>"

343:login:Penguin
07/11/24 17:59:39 z00X8bIQ
>>339それが出来れば良いんですが、
できないのです。方法ありますか?

func内で echo $3; した場合。

func "eee eee" "fff fff" "$LIST" "ggg ggg";
echo $3 → "aaa aaa" "bbb" "ccc ccc ccc" "ddd"
当然のように、LIST全体が一つの引数に、、、

以下のようにクォートをなくすと
func "eee eee" "fff fff" $LIST "ggg ggg";
echo $3 → "aaa
LIST内のスペースで、分解されてしまいます。

$3 に "aaa aaa" を渡したいのに、、、

344:login:Penguin
07/11/24 22:04:52 DnopHw8N
無理にシェルで書くより
perl かなんか使った方がいいんじゃね。
適材適所。

345:login:Penguin
07/11/24 22:28:40 bmHXinLt
eval set $LIST
func "eee eee" "fff fff" "$@" "ggg ggg"


346:login:Penguin
07/11/25 17:46:10 ex492j4k
>>345
これだ!
こんなトリッキーな手法もあるんですね。
奥が深い。ありがとうございました。

347:login:Penguin
07/11/25 22:12:54 nNUo7Vyu
>>342
ありがとうございました

348:login:Penguin
07/11/28 16:44:21 lxwXbk7L
特定のディレクトリ以下にあるディレクトリ名を検索し
そのディレクトリの中にファイルがあった場合のみ変数にディレクトリ名を追加する。
という処理をしたいと考えています。

LIST=`find 特定のディレクトリ -maxdepth 1 -mindepth 1 -type d`
上記のコマンドでディレクトリ一覧は取得できたのですが
取得したディレクトリ一覧の中にファイルがあるかどうかの条件設定方法がわかりません
ご教授ください

349:login:Penguin
07/11/28 16:51:01 hjQ8uHjr
>>348
GNU の find なら ! -empty で。

350:348
07/11/28 17:14:26 lxwXbk7L
>>349
レスありがとうございます。
LIST=`find 特定のディレクトリ -maxdepth 1 -mindepth 1 -type d ! -empty`
上記のコマンドで無事に条件を満たすことが出来ました。

感謝です><

351:login:Penguin
07/11/30 01:52:45 vbHro4B7
1 A
1 B
1 C
2 P
2 Q
3 X
3 Y
3 Z
...
のような入力を
1 A B C
2 P Q
3 X Y Z
...
のように整形する簡単な方法はありますか?

352:login:Penguin
07/11/30 02:21:47 8mp/o88K
awk '{h[$1] = h[$1] " " $2} END { for (key in h) print key h[key] }' < input | sort




353:login:Penguin
07/11/30 13:45:29 zEAz9Kgp
>>352
惚れた

354:login:Penguin
07/12/01 01:13:52 285rAG3t
inputをリダイレクトしているのがイヤ。

355:login:Penguin
07/12/01 01:27:18 aR34EpD+
awkはファイル名を引数に取れるんだな。
パイプでしか使った記憶がなく、素で知らなかった。




356:login:Penguin
07/12/01 11:59:35 lphCOL1Q
むしろパイプでしか使えないコマンドの名前を
パッと挙げろという方がむつかしいだろ

357:login:Penguin
07/12/01 12:16:31 z08ppphA
オプションの引数という形もない、というものはだいぶ少ないね

358:login:Penguin
07/12/01 19:59:33 aR34EpD+
とっさに出てきたのは tr


359:login:Penguin
07/12/01 21:03:16 z08ppphA
MS-DOS 標準添付の SORT (.EXE か .COM か自身がない)

360:login:Penguin
07/12/01 23:25:16 +jVAJI5Z
MS-DOS 標準添付の MORE

361:login:Penguin
07/12/03 14:25:58 pB5IpK3Q
複数のコマンドを実行してログを残したいのですが

( { command1 && command2 } > normal.log ) >& error.log

で、標準出力と標準エラーをファイルにリダイレクトまではうまくいきました。
このエラー出力を、画面にも出すにはどんなふうに書くのでしょう?

URLリンク(x68000.q-e-d.net)
ちなみに、ここまではこの辺を参考にさせていただきました。

お願いいたします。

362:login:Penguin
07/12/03 14:26:53 pnpsuBAG
>>361
tee

363:login:Penguin
07/12/03 15:02:26 pB5IpK3Q
>>362
ありがとうございます
できました。

最初に言ってたのとちょっと違うのですが、ようは、すべてログに保存して
なおかつERRORの文字が入ってる行だけを画面に出力したかったので

2>&1 | tee file.log | grep ERROR

でやりたいことができました。
いろいろ勉強になりました。サンクス。

364:login:Penguin
07/12/03 16:10:39 +7LXyEUm
コマンドラインとGUIを融合するHotwire
URLリンク(opentechpress.jp)

365:login:Penguin
07/12/03 16:33:46 CJjSSdo9
>>364
面白そうだけど、記事の中に具体的な画像が欲しいね・・・・

366:login:Penguin
07/12/03 16:43:39 pm3xTTNy
>>365
URLリンク(code.google.com)

367:login:Penguin
07/12/03 17:31:20 BNt6sl0D
>>366
画像が表示されないのは、送ってくるContent-Typeがおかしいのか。
なんでapplication/octet-streamやねん。

368:login:Penguin
07/12/04 22:59:48 Bpu7L1AF
ややスレ違いだが、くだ質よりこっちかなと

シェルスクリプトの本を買う際に、Linuxユーザーでbashメインで使ってるなら
主旨がbash向けのものを買うべきですか?
それともB shell全般向けやsh向けでbashは補完程度の本でも質の高いものを買うべきでしょうか
両シェルの間にそれほど機能、性格の差はなさそうだし

369:login:Penguin
07/12/04 23:06:21 0gQg9Z1k
bashismって言葉があるくらいで、ついついbashの機能を使ってしまうことは多い。
素のBourne Shellの機能がどこまでなのか書いてある本がいいと思う。


370:login:Penguin
07/12/04 23:28:47 Bpu7L1AF
>>369
サンクス
sh向けでも最近の多くの書籍はbashもカバーしているようですので、その辺りを探してみます

371:login:Penguin
07/12/05 11:12:29 tDVDuECI
URLリンク(www.amazon.co.jp)
そのへん意識するならこれいいかも。
SunOS の bsh と FreeBSD の bsh ( ash ) で違いがある場合についてまで
明記されてる。

372:login:Penguin
07/12/05 21:59:53 KlliiKVC
>>371
その本と、「UNIXシェルスクリプトコマンドブック 山下 哲典」を最後に候補にしてましたが、後者を買いました。
sh、bash共用でサンプルが多いので。

373:login:Penguin
07/12/06 18:06:51 ltYfbiEn
いつも複合条件式でまるんですけど
#!/bin/bash
WAITSEC=""
if [ -z "$WAITSEC" -o $WAITSEC -lt 60 ]; then
    WAITSEC=10
fi
を実行すると
./hoge.sh: line 3: [: too many arguments
というエラーになります。-oとか-aで記述するifは今まで何回かやったのに
一度もできた記憶が無い!!。結局ifを分けたりして対処してきた負け人生です。

いったい何が悪いというのでしょうか??
教えていただけますか?

374:login:Penguin
07/12/06 18:31:24 bgO18Eza
確かにbashだとなるねぇ。zshだとならんから気づかなかったw

#!/bin/bash
WAITSEC=$1
if [ -z "$WAITSEC" ] || [ $WAITSEC -lt 60 ]; then
WAITSEC=10
fi

echo $WAITSEC

とりあえずこれで。

375:login:Penguin
07/12/06 18:35:40 bgO18Eza
と、思ったら出来たw
if [ -z "$WAITSEC" -o \( $WAITSEC -lt 60 \) ]; then

こういうことだな。
優先順位がおかしいんだ。

376:login:Penguin
07/12/07 00:20:04 2WlU8Mqa
>>373
-z "$WAITSEC" の成否にかかわらず $WAITSEC -lt 60が実行されちゃってるから問題なんじゃないか?
おそらく -z "$WAITSEC"のときは 後ろの条件は 「-lt 60」になるだろうから、>>374のようにするか${WAITSEC:-0}とかやったらいいんじゃね?

377:login:Penguin
07/12/07 10:01:03 uKkYmJTB
>WAITSEC=""
なので、
>if [ -z "$WAITSEC" -o $WAITSEC -lt 60 ]; then

if [ -z "" -o -lt 60 ]; then
と解釈されてエラー。
zsh は sh と違って $WAITSEC は "$WAITSEC" と同じ意味なのでエラーにならない。

"$WAITSEC" -lt 60 と書き換えた場合は、

>-z "$WAITSEC" の成否にかかわらず $WAITSEC -lt 60が実行されちゃってるから問題なんじゃないか?

この理由で正しい。


378:login:Penguin
07/12/11 22:53:04 8t30b6aC
シェルスクリプトにコメントを書くには
# comment

っていう感じに # を行頭につけてコメントにしますが、自作のシェルスクリプト等に
日本語でコメントを埋め込むのは良くない事なのでしょうか?
英語でコメントを埋め込むべきなのでしょうか?

理由>環境によっては文字化けするかもしれないから

その場合、英語では上手くコメントがかけないのですが、、、皆さんはこの辺どうしていますか?

379:login:Penguin
07/12/11 23:22:06 8VUAk6YG
>>378
英語では上手くコメントがかけない、って、自分が書いた自分用のスクリプトだったら、
べつに、自分にさえ分かればいいんじゃないの?極端な話、ローマ字で書いた日本語でもいいんじゃないかと。

380:login:Penguin
07/12/11 23:27:45 LcSZkVoI
Shift_JISで書いて2バイト目に ¥ が含まれるとコメントが継続しちまうかな、
と思ったんだが、そうでもないみたいだな。


381:login:Penguin
07/12/12 08:33:10 itajSrlG
>>379
いやー、他の人にもスクリプトの内容が分かるようにコメント書かないといけない場合はどうすれば?
今はローマ字で書いたりしていますが、さすがに見にくいというか・・・ かといって英語では上手くかけないし・・
C言語やJava等では // 日本語コメント が使えるし
MS-DOSの.batファイルでも
REM 日本語コメント
が使える、Windows Script Hosting(WSH)であっても
'日本語コメント
が使えて、大抵のスクリプト言語は日本語のコメントが使えるのになぜにLinuxのシェルスクリプト
だけこんな事で悩まないといけないんだろうと・・・。
まぁOSが違うから文字コード周りのトラブルなんだろうけど・・。

382:login:Penguin
07/12/12 09:12:34 fnWAKO+5
使えるか使えないかっていうなら使えるだろ。
確実に自分しか使わないならShift_JISのようなbrain damagedな文字コードじゃなきゃ
別に何でもいいんじゃない。
しかし使ってよいか使わざるべきかというと、一般にスクリプトって
どのロケールで実行されるかわからないよとかの問題が出てくる。
あなたが出した例ではCやJavaのソースファイルはコンパイルするときの
環境が限定できれば問題ないし、DOSのバッチファイルも日本語DOSしか
考えていない。

383:login:Penguin
07/12/12 11:25:06 ytRjAEEx
>Shift_JISで書いて2バイト目に ▼ が含まれるとコメントが継続しちまうかな、

sjis だろうが何だろうがコメントの継続なんてありません。

>しかし使ってよいか使わざるべきかというと、一般にスクリプトって
>どのロケールで実行されるかわからないよとかの問題が出てくる。

コメントにロケールなんて関係ありません。


384:login:Penguin
07/12/12 11:32:57 11rQvfIz
英語くらい書けよ。

385:login:Penguin
07/12/12 12:33:25 5zz/Y7Bm
っつか、どういう環境(=人間環境)だか知らないけど、
そんな雰囲気だと、頑張って英語でコメントを書いても、
肝心の「他の人」が、それを理解出来ない、
ということが容易に想像出来てしまうわけで、
だったらローマ字でいいじゃん、と思う。

386:login:Penguin
07/12/15 11:57:10 FOfJjZuV
>>383
コメントってのは実行されるときはロケール関係ないけど
元々読むものだから、ロケールばらばらと読みにくくて困るよね
って意味だよ。たぶんね。

387:login:Penguin
07/12/19 22:19:06 qeHYVBDH
#!/bin/bash
for i in *.txt
で、'*.txt' で展開されるリストの長さに制限はある?

ls: argument list too long になる長さでも処理できるようだが、他に何か別の制限はある?

388:login:Penguin
07/12/20 18:50:14 Qtkk7tpx
sedについての質問です

aaa
bbb
ccc

という出力を、sedコマンドで一行にしたいのです。
aaa bbb ccc このように。
どうしたらよいですか。

逆の、sed -e 's/\ /\n/g' はできるのですが。

389:login:Penguin
07/12/20 21:20:24 1r8qT2Sh
awkなら
$ (出力するコマンド) | awk '{printf("%s ", $0)}'
でできるんだけどなぁ

390:login:Penguin
07/12/20 21:47:48 p9kMPhFx
$ cat input
aaa
bbb
ccc
$ sed -n 'H;${g;s/¥n/ /g;s/^ //p;}' input

なんか無様だ。きっともっとスマートに出来るに違いない。


391:login:Penguin
07/12/20 21:49:27 p9kMPhFx
もし各行が空白文字を含まないなら、
echo `cat 元テキスト` > 新テキスト
でいいな。



392:login:Penguin
07/12/20 22:14:22 IRXLh3Ok
>>388
sed ':loop; N; s/\n/\ /g ;$!b loop' hoge

393:login:Penguin
07/12/20 22:19:20 UDgG5/dT
sedにこだわらなければ
tr -s '\n' ' ' < input
とか


394:login:Penguin
07/12/20 22:28:20 p9kMPhFx
目的によっては、
$ fmt input

fmtってUNIX標準?


395:login:Penguin
07/12/20 22:39:06 Qtkk7tpx
>>389-393
こんなにレスが来るとは。
皆さんありがとうございます。

すべて試してすべてで出来ました。
echoとtrはなるほどという感じです。
他は知りませんでした。レベル1アップですね。

396:login:Penguin
07/12/20 22:43:02 Qtkk7tpx
>>394
更新遅れた。
できました。オプションすらいらないとは。

397:login:Penguin
08/01/06 19:04:19 tfZRITK8
awkで
awk '{print $2,$3}' とすると2,3番目が表示されますが
二番目以降全て表示するにはどうすればいいのでしょうか?

398:login:Penguin
08/01/06 19:44:21 TN85yzo6
awk 'gsub($1,"")'

399:login:Penguin
08/01/06 21:41:07 HrtO6pOF
$1に特殊文字が入れられると思わぬ結果になりそうな気がする。

400:login:Penguin
08/01/06 21:53:19 xjxCtnUs
awk '{for (i=2;i<=NF;i++){printf($i" ")}}'

401:login:Penguin
08/01/06 22:56:50 HrtO6pOF
フィールド区切が複数のスペースやタブコードでも、1個のスペースに置換されてしまう気がする。
>>397の「全て」がそこまで求めているかは分からないが。

402:login:Penguin
08/01/07 00:59:34 Lq+3ioDo
>>401
awk -Fなにか  '{for (i=2;i<NF;i++){printf("%s%s", $i, FS)};print $NF}'

403:397
08/01/07 02:29:17 SZZlXYY6
ありがとうございます。
最初 >>387 さんと同じことを思ったのですが他に
オプションか何かで用意されていると思ってました。
402さんのを使わせていただきます


404:397
08/01/07 02:29:58 SZZlXYY6
s/387/398

405:login:Penguin
08/01/07 17:21:59 CzyB4/IB
>>402
これだと複数の空白が一つになって表示される



406:login:Penguin
08/01/07 18:30:26 DBTZ8VT2
awk '{gsub($1, "");print substr($0,2)}'


407:login:Penguin
08/01/07 18:59:30 AGg2gknU
hint:
aho,choaho,kusoaho,doaho

awk '{print substr($0,length($1)+2)}'



408:login:Penguin
08/01/07 20:07:07 81ckgAQ5
個人的には>>398をアレンジして、
gawk 'gsub(/^[[:blank:]]*[^[:blank:]]+/,"")'
かな。

409:login:Penguin
08/01/07 20:13:04 DBTZ8VT2
なんだ>>398で既出だったのね。見落としスマソ。

410:login:Penguin
08/01/07 23:07:24 6d+dex8H
[file1]
bar=234

[file2]
foo=123
Bar=987

と2つのkey=valueな内容が入ってるファイルがある。ここで、file1には
ないがfile2にはあるkeyのみ(case-insensitiveな比較で、また、valueは
違っていてよい)を拾いkey=valueを出力したいのだけど、一行で書けないかな?

どういう出力になってほしいかというと

 $ myuniq --split-char='=' --field-index=1 --print-unique file1 file2
 foo=123

というような実行イメージ。awkで

awk -F= '{ line[toupper($1)]=$0; seen[toupper($1)]++; } END { for (key in line) if (seen[key] == 1) print line[key]; }' file1 file2

みたいなのはでっち上げたんだけど、正直汚い。


411:login:Penguin
08/01/07 23:30:18 6RYIn4eu
回答じゃなくてすまんのだが、最後にあるワンライナーだと、
2ファイル通して1回しか現れなかったものを表示するから、
「file1にはないがfile2にある」ものだけでなく
「file2にはないがfile1にある」も出てこないか?


412:login:Penguin
08/01/07 23:35:18 6RYIn4eu
負けず劣らずかっこ悪いシロモノ

for w in `cut -d= -f1 file1 file2 |tr A-Z a-z|sort|uniq -c|sed -n 's/ 1 *//p'`; do grep "^$w=" file2; done


413:login:Penguin
08/01/07 23:52:40 DBTZ8VT2
grep -v -i "`cut -d= -f1 file1`" file2

重複は無考慮


414:login:Penguin
08/01/07 23:54:29 6d+dex8H
>>411
あ、すみません。バグです。が、元の仕様が厳しすぎで、

 どちらかにしかないエントリを出す

でも大丈夫でした。

 file1かfile2のどちらかにのみあるkeyに対応するkey=valueを出力する

に仕様を訂正させてください。

何をしたいのかというと、Windowsの環境変数を手元のUNIXな環境に
取り込みたいのですが、その際に自分で定義している分については
上書きされないようにしたいのです。

hostA$ env > hostA.env
hostB$ env > hostB.env
hostB$ myuniq ... hostA.env hostB.env > diff.env
hostB$ . ./diff.env

みたいなことをしたいと。で、片方の環境が Windows なもので、
case insensitiveな比較とかも必要になってます。

行全体ではなく特定のフィールドのみ見て uniq/diff 処理して出力って
簡単そうで微妙に面倒です。

415:login:Penguin
08/01/07 23:59:58 6d+dex8H
>>413
おおー。grepのexprに改行入れるとそんな動作になるとは!
エレガントです。勉強になりました mOm

416:login:Penguin
08/01/08 18:35:59 0P1F18Bp
1行で2つのコマンドを実行するときに
2つ目に実行したコマンドに、1つ目に実行したコマンドの引数を
そのまま渡したい場合の記述方法がわからず、困っています。

$ vi hogehoge; echo ??
*??が不明箇所*

上記の例の場合は2つ目に実行しているecho文の出力結果でhogehogeを表示させたいのですが。。
対処方法はないでしょうか?
よろしくお願いいたします。

417:login:Penguin
08/01/08 18:38:30 k6k1za9N
>>416
i="hogehoge"; vi $i; echo $i
じゃだめなん?

418:416
08/01/08 19:34:39 0P1F18Bp
>>417
ありがとうございます。
その方法があったことに気づきませんでした。
おかげで解決しました、感謝です><

419:login:Penguin
08/01/08 23:12:30 OqUgF6yk
vi hogehoge; echo !$

420:login:Penguin
08/01/08 23:26:00 5sg6/WvN
>>419
それタイプしたタイミングではまだ!$は前行のコマンドの。


421:login:Penguin
08/01/08 23:33:15 A2IkwjEN
引数が一つだけなら

vi hogehoge; echo $_

でもいけるな。

422:login:Penguin
08/01/10 13:02:51 9dVYtTPe
cshからJavaを呼び出すシェルを作成しています。

その呼び出したJava内部で例外が発生した場合、
以降のシェルの処理を続行させたくありません。

どの様にすればよいのですか?
Javaのcatch節でSystem.exit(1);とかで処理を終了させて、
cshでそれを検知する方法があるのかなぁ?
と漠然には思うのですが・・・


423:login:Penguin
08/01/10 19:51:46 qThypT9T
>>422
System.exitが何をするのか分かっているなら、
Javaコマンドの終了値を普通にifなりswitchなりで受けて、csh側からもexitすれば良いだけでは?
単純に例外=即終了と決め打ちなら良いけど、例外によって複数の処理をさせたくなると、
System.exitの終了値を多数用意して管理しなければならなくなって面倒だけどね

ここからはポリシーの問題になるけど、System.exit等を使ってコマンドの終了値を利用するよりは、
どんな例外で終了したのかを前もって文字列等でstderrにでも吐き出したり、
終了した例外を表すような長さゼロのテンポラリファイルでも作ってから、Javaコマンドの方を終了させておいて、
csh側からは、むしろその文字列やファイル名を評価させてexitさせるようにした方が、後からデバッグする時とかは楽だよ

更に言えばシェルプログラミングにcshを使うのは止めるべき
URLリンク(www.klab.ee.utsunomiya-u.ac.jp)
URLリンク(www.klab.ee.utsunomiya-u.ac.jp)

424:login:Penguin
08/01/10 21:50:31 CJRDs9Ag
Javaのポリシーは知らないが、エラーメッセージと終了コードは二者択一せにゃならんものではない気がする。

425:login:Penguin
08/01/11 14:14:06 mrGJLB/g
>>423、424
ありがとうございます。

シェルスクリプト自体、経験が浅い上に今回の要望がcshというのが
決まっているもので・・・
困っています。。。
2chでの質問自体も初めてなもので・・・

準正常として扱うような例外は全てJava側で処理をしてプログラムは
正常終了として扱っています。
処理続行不可能と判断した、ランタイム系やIO例外などが発生した場合は
後続のシェルを流したくない。
という状況です。



if $JAVA_CMD
then
続き
else
exit 1
fi

以下処理続く
・・・
ってな感じにしたのですが、どうも上手くJavaでexitした値が取れないです。
文法が間違っているのですかね?
もう少し調査してみますが、上記の書き方で間違いがあればご指摘頂きたいです。

後は教えていただいた、テンポラリファイルでの判断も考えてみます。


426:login:Penguin
08/01/11 15:11:54 GLHvzQDj
findコマンドの結果をツリービュー(treeコマンドの結果的なツリー表示)で出すコマンドまたは方法ってありますか?

427:login:Penguin
08/01/11 16:08:44 6CIbL1kG
>>425
cshなら

$JAVA_CMD
if ($? != 0) then
  echo "failed"
  exit $?
endif

echo "OK"

でどう?

428:login:Penguin
08/01/11 16:55:30 mrGJLB/g
>>427
ありがとうございます。
教えていただいた方法で、想定通りの動作になりました。


429:login:Penguin
08/01/11 21:11:49 OPXAXUzh
>>426
普通にtreeコマンド使うんじゃだめなん??
findで絞った結果を出したいのかなぁ。


430:login:Penguin
08/01/11 22:17:07 4hqMEkJ5
grep -f find結果 tree結果
とか。

# 本気にしないように。

431:login:Penguin
08/01/11 23:02:21 aloediIm
基本的にはtree | grep なんちゃら でいいんじゃね?

432:login:Penguin
08/01/14 11:50:49 3iR1bkH0
画像の特定の領域だけを一括でぼかしたいのですが
いい方法はありませんか?

433:login:Penguin
08/01/14 12:00:15 ZjONjaHo
つ netpbm



434:login:Penguin
08/01/14 12:12:55 6n5zEajJ
つimagemagick


435:login:Penguin
08/01/14 14:01:26 Or9vH7Fn
メールアドレスの@以降の最後の国を表すCountry Codeの部分だけを抜き出すには
どのような正規表現を使えば良いでしょうか?

@hotmail.co.jp の.jp の部分を見る感じです。
.jp以外は無視する、という感じです。これで日本のメールしか相手にしない事になりますよね。

436:login:Penguin
08/01/14 14:04:07 ZjONjaHo
spam避け?

日本からも.comや.netや.orgや.infoや.bizや.acや.tvや.toや(以下略)の
アドレスでメールが送られることはあるぞ。


437:login:Penguin
08/01/14 14:04:25 Or9vH7Fn
$.jp

↑これでいいんでしょうか?正規表現全く知らない状態でネットでちょっと検索してみたのですが・・・

438:login:Penguin
08/01/14 14:05:05 Or9vH7Fn
あっちゃー、そうなんですか・・・
海外のメールを相手にしない方法って無いんですかね・・・
英語でViagraとかうるさいんですよ。

439:login:Penguin
08/01/14 14:17:08 6n5zEajJ
/[あ-ん]/?
ひらがながないメールは無視してもよかろう。

440:login:Penguin
08/01/14 14:37:34 FCIPzPAY
ヘッダの Content-Type を見て弾くとかどうよ?

^Content-Type: .*iso-2022-jp


441:login:Penguin
08/01/14 14:42:36 6n5zEajJ
最近はutf-8なのも多いよ。


442:login:Penguin
08/01/14 14:54:07 JtG94m55
utf-8 は違法で、危険運転致死罪が適用になるんじゃ?

443:login:Penguin
08/01/14 22:54:28 RfE0b+o0
>>437
\.jp$

では?

444:login:Penguin
08/01/16 13:17:12 ZRO/FTzi
テキストファイルを、最後の3行を除いて出力したいのですが
何か良い書き方はないでしょうか。
sed '$d' xxxx | sed '$d' | sed '$d' と書くくらいしか思い付かなくて。

445:login:Penguin
08/01/16 14:26:14 1obpvu1A
>>444
head -n -3 foobar.txt

446:login:Penguin
08/01/16 17:01:38 IKqjky5V
awk '{a[NR]=$0}END{for(j=1;j<=NR-3;j++) print a[j]}' a.txt

447:login:Penguin
08/01/16 18:25:12 ZRO/FTzi
>>445
head のオプションは見落としてました…ありがとうございます

448:login:Penguin
08/01/16 21:56:01 KAlEWwYc
ランダムな数字が欲しいとき,どうするのが簡単?
1. $$
2. $RANDOM
3. /dev/urandom
4. 時計
あたりを思いついたんだけど

449:login:Penguin
08/01/16 22:14:57 yh54UVVr
ワシは、ランダムな数字の用途により生成手段を変えてるような気がする。

450:login:Penguin
08/01/16 22:16:21 KAlEWwYc
1. 偏りそう
2. bash依存
3.4. 面倒
という問題点があるから,誰かいい方法教えてくれないか?

451:login:Penguin
08/01/16 22:19:14 KAlEWwYc
>449 たしかに用途によって求められる強さが違う気がする.
とりあえずこうしとけ的な汎用的な方法はないんかな.
いちばん手軽な方法が知りたい


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch