シェルスクリプト相談室at TECH
シェルスクリプト相談室 - 暇つぶし2ch809:デフォルトの名無しさん
08/03/04 17:36:26
>>808
即レスありがとうございます!
出来ました<(_ _)>

810:デフォルトの名無しさん
08/03/10 15:02:33
while read lineでファイルを読み込んで
その行にABCと言う文字があるかないか判定して
あれば 処理1
なければ 処理2という if文での書き方教えてください

811:デフォルトの名無しさん
08/03/10 21:33:37
case $line in
*ABC*)
処理1
;;
*)
処理2
;;
esac

ってif文でかよ!



812:デフォルトの名無しさん
08/03/10 22:20:20
grepと組み合わせないと無理か。
1行ごとにgrepなんか起動したくないが。

813:デフォルトの名無しさん
08/03/10 23:24:46
line2=${line%%ABC*}${line##*ABC}
# で削って
if [ ${line} = ${line2} ]; then
# 処理1
else
# 処理2
fi
# とか?

814:デフォルトの名無しさん
08/03/10 23:49:58
if [[ $line =~ ABC ]]; then
echo matched
else
echo did not match
fi
こういうこと?

815:デフォルトの名無しさん
08/03/12 23:35:10
1レコードのXMLを、シェルを使って字下げなどを自動で行って表示させたいのですが、
なにかうまい方法はないでしょうか?

---------------------------
<all><a>123</a><b><c>456</c><d>789</d></b></all>



<all>
<a>123</a>
<b>
<c>456</c>
<d>789</d>
</b>
</all>
------------------------

というような感じで・・・

816:デフォルトの名無しさん
08/03/12 23:37:16

すいません、4タブで字下げされてると思ってください。


817:デフォルトの名無しさん
08/03/12 23:48:55
整形式XML全般を扱うというのは、かなり難しいんじゃないか?
perlとかrubyとか使うべき。
よほど単純化されてるんなら、まずはタグ1個が1行になるように改行して、
開始タグなら字下げを増やして、終了タグなら字下げを減らして、って感じか。
ただこれでは <c>456</c> とか無理だが。

818:デフォルトの名無しさん
08/03/13 03:26:53
>>815
おおざっぱに手順を考えてみた。
めんどくさそうなので実装はまかせた。

1. 行の最初にあるタグとその閉じタグの間に他のタグがあれば、タグの頭で改行する。
  この時にインデントの深さをタブ幅文プラスしてタグ名を記録する。
2. インデントの深さが 0 以上ならインデントする
3. タグの間にタグが無いなら閉じタグで改行
4. 記録したタグの閉じタグを見つけたらインデントの深さを減らして記録から削除。
5. 1-4 繰り返し

819:デフォルトの名無しさん
08/03/13 03:29:03
xmllint --format に食わせればおk

820:デフォルトの名無しさん
08/03/16 13:13:44
cron などによってある時刻に自動的に起動させるプロセスで、
実行開始から xxxx秒 とか経過してもまだ終了しない場合
強制的に終了させる方法にはどんな方法があるでしょうか?

そして、その方法で注意しておかなければならない
点とかあれば教えてください


821:デフォルトの名無しさん
08/03/16 15:00:29
起動したいプロセスをバックグランドで起動して、
必要な秒数sleepしたら問答無用でkillするとか。
そのプロセスが、適切な後処理のために特殊なシグナルを利用できるのなら、
killでそのシグナルを指定すればいい。

822:デフォルトの名無しさん
08/03/16 16:33:55
>>820
ロックファイルを作るタイプはプロセスだけ殺しちゃうと
困った事になるかもしれない。

823:デフォルトの名無しさん
08/03/16 16:44:02
だからそういうプロセスは適切なシグナルハンドラを用意するべきなんだよね。

824:デフォルトの名無しさん
08/03/25 22:12:46
Cシェル(ソラリス)について教えてください。
test.txtに、helloが入っていたら、OK、
無ければ、NGと判定させたいのですが、
以下のようにしてもIF文が不正ですと言われます。
Bシェルでは、うまくいくのですが、Cシェル用の記述方法等
ありましたらアドバイスください。

if ( cat test.txt | grep "hello" ) then
    echo OK
else
    echo NG
endif

825:デフォルトの名無しさん
08/03/25 22:14:58
$status

826:デフォルトの名無しさん
08/03/26 00:19:08
>cat test.txt | grep "hello"
なんでgrep "hello" test.txtにしないんだ?

827:デフォルトの名無しさん
08/03/26 08:23:26
B shell 使えばいいじゃん。

828:デフォルトの名無しさん
08/03/27 14:06:37
ファイル 1.txt 2.txt 3.txt test.bash が存在するディレクトリで以下の
内容を実行するとなぜ1が返ってきますか?4になぜならないのかわかりません。

--test.bash--
#!/bin/bash
current_files=$(ls)
echo ${#current_files[@]}

829:デフォルトの名無しさん
08/03/27 21:32:48
for で current_files の中身を見てみると分かるかと。

for file in "${current_files[@]}"; do echo "[[[$file]]]"; done

830:デフォルトの名無しさん
08/03/28 00:59:01
>>828
× current_files=$(ls)
○ current_files=( $(ls) )

空白入りのファイル名があると期待通り動かないから気をつけろ

831:デフォルトの名無しさん
08/03/28 01:19:09
いつもそこで悩むんだけど、
空白入りのファイル名があっても大丈夫な方法ってないの?

832:デフォルトの名無しさん
08/03/28 01:46:20
>>831
つperl
つruby
つpython


833:デフォルトの名無しさん
08/03/28 02:49:45
つzsh

834:デフォルトの名無しさん
08/03/28 02:54:25
>>831
あるにはあるが、正直面倒。

1) 一時的 IFS 変更
IFS=$'\n' current_files=( $(ls) )

2) for + ワイルドカード
for file in * ; do
current_files[${#current_files[@]}]=$file
done

3) while + read + here strings (パイプは不可)
while read file ; do
current_files[${#current_files[@]}]=$file
done <<< "$(ls -1)"

835:デフォルトの名無しさん
08/03/28 07:18:29
>>834
ほうほう・・・。3 とか凄いですな。

836:828
08/03/28 09:29:29
うぉぉ・・!激しく助かりました。
シェルなんて初めてなんでw奥が深いな。

837:デフォルトの名無しさん
08/03/30 23:14:01
ファイルから読んだ文字列をfindに引数として渡して、
ファイル一覧を取得するスクリプトを作りたいのですが、うまくいきません。
以下の内容でおかしな部分があったら指摘をお願いします。

ディレクトリ構成
dir
+---nkf_args
+---filelist.sh
+---a.cpp
+---b.cpp
+---a.h
+---b.h

----------------------------
nkf_argsファイル
-name "*.cpp" -or -name "*.h"
----------------------------
filelist.shファイル
#!/bin/sh

#nkf_argsファイルから引数文字列取得
nkf_args=`cat nkf_args`

#findで条件に一致したファイルリスト取得
files=`find ./ $nkf_args`
for filename in files
do
echo "$filename"
done


838:837
08/03/30 23:16:40
続き

スクリプト実行結果

予想値
a.cpp
a.h
b.cpp
b.h

結果
出力無し

ここまで
--------------------------------



839:837
08/03/30 23:19:28
ちなみに引数ファイルに書かれているものの
ダブルクォーテーションを外すことで
*.cppに関する結果は得られましたが、
*.hに関する結果は得られませんでした。

840:デフォルトの名無しさん
08/03/31 00:03:22
取り敢えず、filelist.shの1行目を#!/bin/sh -xにして実行してみたら?

841:デフォルトの名無しさん
08/03/31 00:32:52
そのfindでのORって-oだったりしませんか?

842:デフォルトの名無しさん
08/03/31 00:35:38
>>841
POSIXのfindなら、-orは-oと同じ(とmanに書かれている)だから大丈夫。

843:デフォルトの名無しさん
08/03/31 01:12:40
>>839
そのやり方を試してみました。
--------------------------------------
出力
++ cat nkf_args
+ nkf_args='-name "*.c" -or -name "*.cpp"'
++ find ./ -name '"*.c"' -or -name '"*.cpp"'
+ files=
--------------------------------------

出力結果を見るとダブルクォーテーション部分が、
さらにシングルクォーテーションで囲まれるから駄目なのかと思い、
ダブルクォーテーションを外してやってみました。
--------------------------------------
出力
++ cat nkf_args
+ nkf_args='-name *.cpp -or -name *.h'
++ find ./ -name a.cpp b.cpp -or -name a.h b.h
find: paths must precede expression
Usage: find [path...] [expression]
+ files=
--------------------------------------
ダブルクォーテーションを外した結果は
作業ディレクトリにあったファイル名に置き換えられて
無効な引数になってしまいました。

以上の結果を踏まえて、条件に合うファイルがないディレクトリから
スクリプトを実行した結果、想定していた結果が得られました。
ただ、根本的な解決になっていない(どういう動作をするか分かっていないと、正しい結果が得られない)ので、
これをディレクトリ状態に依存しないようにしたいのですが、どういう方法があるのでしょうか?
よろしくお願いします。

844:デフォルトの名無しさん
08/03/31 02:42:39
files=`find ./ $nkf_args`

files=`eval find ./ $nkf_args`
としたらうちでは上手くいったよ。

845:デフォルトの名無しさん
08/03/31 02:56:20
>>844
試してみたところ、想定している結果が得られました。
皆さんありがとうございました。


846:デフォルトの名無しさん
08/04/02 09:40:50
Cシェルで、以下のようなテキストファイルに保存した内容と
コマンドを組み合わせた処理をしたいと考えています。

・command.txtの内容
 grep httpd

/bin/csh -f
set command = `cat command.txt`
ps -ef | "command" > kekka.txt

上記のように試したのですが、書式が不正の為、
エラーとなります。
ps -ef | grep httpdの実行結果を、kekka.txtに保存したのですが、
どのようにすれば良いでしょうか。アドバイスお願いいたします。



847:デフォルトの名無しさん
08/04/02 09:51:35
"command" → $command

848:デフォルトの名無しさん
08/04/02 10:44:30
>>847
即レスありがとうございます。
ps -ef | "$command" > kekka.txt としても
grep httpd: コマンドが見つかりません。という
エラーが発生します。
ps -ef | grep httpdの実行は可能です。
何が問題となっていますでしょうか。


849:デフォルトの名無しさん
08/04/02 10:52:50
アホ

850:デフォルトの名無しさん
08/04/02 11:38:28
847のすべての文字を100回音読しなさい

851:デフォルトの名無しさん
08/04/02 11:38:37
>>848
#!/bin/sh
command=`cat command.txt`
ps -ef | $command > kekka.txt


852:848
08/04/02 16:06:20

すみません。よく読んでダブルクォーテーションを外したところ、
正常に実行できました。ありがとうございます。
恥の書き捨てでもう一つ質問させてください。
コマンドにパイプ繋ぎで複数の指定をしたいと思ってます。
command.txtの内容が、grep httpdであれば実行できるのですが、
grep httpd | grep -v grepとすると、以下のようなエラーになります。

> grep httpd | grep -v grep
> grep: | をオープンできません。
> grep: grep をオープンできません。
> grep: -v をオープンできません。
> grep: grep をオープンできません。

これを防ぐ方法は無いでしょうか。
もしくは、command.txtに「ps -ef | grep httpd | grep -v grep > kekka.txt」と
書いてあって、それをそのまま、Cシェルで実行する方法は無いでしょうか。

853:デフォルトの名無しさん
08/04/02 16:13:03
csh -f command.txt
csh -fc "$command"
csh -fc "`cat command.txt`"


854:デフォルトの名無しさん
08/04/02 16:14:04
>>852
URLリンク(www.kiso.tsukuba.ac.jp)

855:848
08/04/02 17:07:37
>>853
ありがとうございます。<(_ _)>

856:デフォルトの名無しさん
08/04/03 00:08:25
>>848
source command.txt

857:デフォルトの名無しさん
08/04/28 23:56:01
シェルでroot権限で実行してるのに、
ファイルが作れないとか、パーミッションエラーが出る
場合があるんだけどどうしてなの?
OSが同じ他のマシンじゃ正常に実行できる
細かいところでマシンの仕様がちがってるんだろうけど
なんでなんだよ。root権限なのに。。。

858:デフォルトの名無しさん
08/04/29 00:29:17
>>857
情報が少ないな。少なくとも
# ls -ld .
位は欲しい。

859:デフォルトの名無しさん
08/04/29 00:36:06
root でも root の書き込み属性がないと書き込めないよ

860:デフォルトの名無しさん
08/04/29 02:18:59
BSD系ならchflagsあたりが関係してるかもしれん

861:デフォルトの名無しさん
08/04/29 22:02:37
bashなのですが
$ tgts=`find . -name \*.\[hc\]`
$ for tgt in $tgts; do
cp ${tgt} ${tgt}.orig
done

cp: `ここにファイル名ずらずら` にアクセス中: File name too long
と言われてしまいます。

tgts=`find . -name \*.\[hc\] -printf "%p "`としてIFS=" "でも同じでした。
tgts=`find . -name \*.\[ch\] -print0`だと
cp: `./aaa.h' と `./aaa.h' は同じファイルですとか言われてしまいます><

862:デフォルトの名無しさん
08/04/29 22:08:13
エラーの原因はよくわからないけど、パイプするかfind -execするかしたらどう

863:861
08/04/29 22:27:15
すみません
bashでなくてzshでした
bashだとちゃんと動きました

864:デフォルトの名無しさん
08/04/29 22:29:44
zshなら$tgtsが単語に分割されないから。${=tgts}だといい

865:デフォルトの名無しさん
08/05/11 19:00:56
シェルスクリプト修正の工数見積もりにあたって、修正対象のスクリプトのステップ数を出したいのですが、みなさんはどのような方法で行っているのでしょうか?
よろしくお願いいたします。

866:デフォルトの名無しさん
08/05/11 20:17:06
>>865
先に(こっそり)スクリプトを書いて、実績を「工数見積」として出す。

シェルスクリプトを「ステップ数」で見積もるなど馬鹿馬鹿しくてやってられない。
ステップ数換算で、ど~の・こ~の言うのは太古のCOBOLの悪習。

867:デフォルトの名無しさん
08/05/12 06:24:34
>>865
そういう話はマ板向きじゃないのだろうか。

まあそれはそれとして、シェルスクリプトなんてやってることは
一般のアプリケーションプログラムに比べて小さくて特定されてるんだから
修正するのは新しく作り直すのと同義だろ。
新規作成と同額でいいんじゃね?

/etc/rc.d/並みの複雑怪奇なスクリプトだったらこの話はあてはまらないが、
そういうのはperl,python,rubyで書かないのが間違い。


868:デフォルトの名無しさん
08/05/15 21:10:59
echo "hoge" | read Hage
echo $Hage

これって読み込んでくれないの?

869:デフォルトの名無しさん
08/05/15 22:57:12
>>868
echo "hoge" | (read Hage)
の状態になって、サブシェルの変数をセットして終わる。
echo "hoge" | (read Hage; echo $hage)

zshなら大丈夫。


870:デフォルトの名無しさん
08/05/15 23:00:26
読み込むよ。これ試して味噌。
--
echo foo | (read; echo $REPLY)
--
って書くために検証してたら先を越されたw

871:デフォルトの名無しさん
08/05/15 23:37:59
>>869,>>870
thx.
でもよくわからない。

#!/bin/sh
alert --info "Whitch Resolution" "1600x1200" "1280x1024" "1024x768" >RES
read Res <RES && rm RES
echo "Resolusion is "$Res
case "$Res" in
"1024x768" ) echo "mode 1024 768 32" >/boot/home/config/settings/kernel/drivers/vesa ;;
"1280x1024" ) echo "mode 1280 1024 32" >/boot/home/config/settings/kernel/drivers/vesa ;;
"1600x1200" ) echo "mode 1600 1200 32" >/boot/home/config/settings/kernel/drivers/vesa ;;
esac
#shutdown

これの$Resを得たいんだが、パイプで取得できないのかと思ってのですが。

872:デフォルトの名無しさん
08/05/16 00:04:03
できないからファイルに入れてるってことでしょ。
ただ、
Res=`alert ...`
とすりゃいいのにとは思う。

873:デフォルトの名無しさん
08/05/16 00:25:29
>>872
Res=`alert --info ・・・・`でいきます。
Res= `じゃダメなのか、なるほど。

874:デフォルトの名無しさん
08/05/17 06:03:17
bashで乱数を用いてで数値3桁(000~999)を表示させるにはどうしたらいいでしょうか?
hoge=`${RANDOM} | cut -c 2-4 `
echo $hoge
としてるんですがこれだと表示が2桁や1桁のときに桁数が揃わなくて困っております。

875:デフォルトの名無しさん
08/05/17 09:33:30
pりんtf

876:デフォルトの名無しさん
08/05/17 09:39:08
”パーセントさんエスバックスラシュn” $ほげ

877:デフォルトの名無しさん
08/05/17 09:46:34
あっ、間違った、>>875,876は忘れてくれ。

878:デフォルトの名無しさん
08/05/17 10:51:46
あってんじゃん。
printf "%03d\n" $hoge

879:デフォルトの名無しさん
08/05/17 13:32:18
おっ、惜しかった、0が必要なんですね。勉強になった。

880:デフォルトの名無しさん
08/05/18 18:39:35
質問した本人はどこに消えたんだろう?

881:デフォルトの名無しさん
08/05/21 23:08:31
/dev/nullの闇に呑まれたのだった・・・


882:デフォルトの名無しさん
08/05/22 10:26:59
歓呼工面でなかってよかったのう。

883:デフォルトの名無しさん
08/05/22 20:42:02
今、プロセス監視ツールについて調べてまして
プロセスに常駐するシェルを作りたいと思ってます。
ps -ef | grep sh を実行して、常時起動しているシェルというのは、
どうやって書けばいいのでしょうか。
また、この際に表示されるPIDは、常時同じ値にしたいと思ってます。
アドバイスお願いいたします。

884:デフォルトの名無しさん
08/05/22 20:58:01
シェルをつくるのですか。
URLリンク(jubilo.cis.ibaraki.ac.jp)
ここいら辺を参考に頑張ってください。

885:デフォルトの名無しさん
08/05/22 21:24:52
すみません。プロセスが常駐するシェルスクリプトを
作りたいのです。

886:デフォルトの名無しさん
08/05/22 21:33:17
#!/bin/sh
while :; do :; done

887:デフォルトの名無しさん
08/05/22 21:43:42
OSによってはwatchというコマンドがあるかもしれない。
watch ps -ef

なければ>>886のdoの中身の:をps -ef ; sleep 10とかにすればいいんじゃね。


888:デフォルトの名無しさん
08/05/22 22:05:10
>>886-887
ありがとうございます
今すぐ試せないんですが、Watchやってみます。
sleepはやってみたんですが、シェルスクリプトが
プロセスとして残るのではなく、sleepコマンド自体の
プロセスとして残ってしまいました。
>>886は無限ループというのは分かるんですが、
負荷が上昇したりしないでしょうか。

889:デフォルトの名無しさん
08/05/22 22:18:08
sleepは当然残るけど、親プロセスであるshも残ってないか?

890:デフォルトの名無しさん
08/05/22 22:24:06
#!/bin/sh
kill -19 $$


891:デフォルトの名無しさん
08/05/22 22:36:54
>>889
それが残らなかったんです。linuxなんですが・・・。
ディストリビューションは多分centosです。
SOLARISはshが出てたんですが・・

892:デフォルトの名無しさん
08/05/22 22:46:28
つか、常駐して、何させたいのよ

893:デフォルトの名無しさん
08/05/22 23:11:31
プロセス監視ツールの検証をしたいんです

894:デフォルトの名無しさん
08/05/22 23:36:36
シェルスクリプトは監視される側?
多少負荷あがっても無駄にループしてりゃいいじゃん
気になるなら、: を sleep 1 にでも変えて

895:デフォルトの名無しさん
08/05/22 23:37:20
DOSのTSRみたいなのを作りたいってことかと思ったら違うのか。
もしかしてcronで定期実行させる方が目的にかなってたりしないか?

896:デフォルトの名無しさん
08/05/23 01:39:00
sleepしている間に食うリソースってプロセステーブル1エントリと、
コードが常駐する分のメモリ?


897:デフォルトの名無しさん
08/05/23 01:46:18
あと標準入出力&エラー出力のファイルデスクリプタとPTYのマスター&スレイブ (閉じてなければだが)

898:デフォルトの名無しさん
08/05/23 01:54:29
>>895 私もそう(TSR)思ってた上で冗談のつもりで>>890
を書いたんだが実はそういうのが欲しかったとは。
だまされた気分だぜ。


899:デフォルトの名無しさん
08/05/24 01:44:25
エロイ人教えて
$1が a b
$2が c d

出力結果
a c
a d
b c
b d

どうやるの?




900:デフォルトの名無しさん
08/05/24 03:42:38
>>899
まず出力結果に至るルールを書かんかい
求めたいものが直積とは限らんからな

901:デフォルトの名無しさん
08/05/24 07:53:29
A="a b"
B="c d"
for a in $A; do for b in $B; do echo $a $b; done; done

902:899
08/05/24 12:08:55
>>900
やりたいことは"シェルをテストする"ためのシェルを考えてる。
テストしたいシェルに引数を与えて出力結果を別ファイルに出力する。
シェルはkシェル。
OK?

>>901
サンク
あと、引数にスペース(空白)も含めたいんだけど
A=a b スペース(空白)
A=c d スペース(空白)

出力結果
a c
a d
a
b c
b d
b
c
d

よろしくです

903:デフォルトの名無しさん
08/05/24 12:14:32
A="a:b::"
B="c:d::"

OLDIFS=$IFS
IFS=:
for a in $A; do for b in $B; do echo $a $b; done; done
IFS=$OLDIFS

頭に蛆でもわいてるのか

904:899
08/05/24 12:37:21
>>903
おぉーはぇー
サンク!
おめ~口は悪いけど面倒見の良いエロイ椰子だな
ありがと!

905:デフォルトの名無しさん
08/05/25 07:32:25
scriptの中から呼び出されたprogramの処理が終了していることを
知るにはどうしたらいいですか?

906:デフォルトの名無しさん
08/05/25 08:09:45
kill -0 $! && echo alive

907:デフォルトの名無しさん
08/05/25 08:55:38
thx!

908:デフォルトの名無しさん
08/05/25 23:52:01
root以外で動かすスプリクト内で特定のファイルをchownで所有者を
変更したいんだけsudoもexpectも使わずにできる?

909:デフォルトの名無しさん
08/05/26 00:07:45
Linuxのようにスクリプトのsetuidを無視する環境なら、
スクリプトを呼ぶだけの実行ファイルを作ってそっちをsetuidする。


910:デフォルトの名無しさん
08/05/29 23:13:02
tarファイル内のデレクトリとかファイルをリネームできる?
あるいはリネームしながら展開できる?

911:デフォルトの名無しさん
08/05/30 01:05:16
>>910
スレ違い。アーカイバ関連のスレで訊くべし

912:デフォルトの名無しさん
08/05/30 01:17:12
この板的には、tarのフォーマットを調べて、
リネームするツールを作ろうという趣旨かも。
しかしスレ違いか。

913:デフォルトの名無しさん
08/05/30 01:42:54
特定の名前対応付けファイルにしたがって、
一旦目的のファイル/ディレクトリを展開して
mvで目的の場所にリネーム移動させるものを
つくるというスクリプトならかろうじて・・・


そこまでの意図はないと思うが。

914:デフォルトの名無しさん
08/05/30 01:51:43
ヘッダー情報だけ書き換えて展開は本物のtarにやらせれば良い。
前の勤務先で作ったときは50行(perl)くらいで出来たような気がする。

915:デフォルトの名無しさん
08/05/30 20:04:48
文字列中のスペースをエスケープシーケンス付けて"\ "に変換する
スクリプトを作りたいのですが、どうしたら良いでしょう?
sed を使うと連続スペースを
1つのスペースとして扱われてしまい上手く行きません。

"sample sample"(スペース2以上) っていう文字列を "sample\ \ sample"にしたい。

916:デフォルトの名無しさん
08/05/30 22:28:33
~$ echo "sample sample" | sed -e 's/ /\\ /g'
sample\ \ sample


917:デフォルトの名無しさん
08/05/30 22:44:45
>916
あれ、それで行きます?ってか家のCygwin上でも出来てるな
これでも出来なくて、2~3時間いろいろ試して、うんうん唸ってたんですが、
バージョンや処理系で動作がちがうとかないですよね・・・
月曜にリトライします。なんか馬鹿やったかな?

918:デフォルトの名無しさん
08/05/30 22:51:54
>>917
gが付いてなかったんじゃないのか?

919:デフォルトの名無しさん
08/05/30 23:25:04
いや、そういうのではなく、記憶が確かなら

echo "sample     sample" | sed -e 's/ /:/g'
(sampleの間は連続半角スペースね)
ってやったら、

"sample:sample" スペースを一つとして扱われた
みたいな結果しか帰ってこなかったんだけど。
何かを間違えたんだろうね多分。なにを間違えたやら。

920:デフォルトの名無しさん
08/05/31 02:59:01
ubuntu@ubuntu-desktop:~$ echo "sample sample" | sed -e 's/ */:/g'
sample:sample

921:デフォルトの名無しさん
08/05/31 03:01:29
勘違いす。>>920は消去。

922:デフォルトの名無しさん
08/05/31 03:30:54
#!/usr/bin/fontforge

仲間に入れてもらえますか?

923:デフォルトの名無しさん
08/06/04 22:42:10
相談に乗ってちゃぶ台!

任意のディレクトリ下の全てのファイルの更新日時を
フルパスで1行づつ取得したい。また更新日時をyyyymmdddHHMMSSで
取得したい。

例)
/home/usr01/aaa/bbb.txt 20080101125525
/home/usr01/aaa/ccc.tar 20080123195530
/home/usr02/ddd.txt 20070811210121
/home/usr03/eee/fff/ggg/hhh/jjj.cfg 20060301042133

よろしくお願いします、みなさん

924:デフォルトの名無しさん
08/06/04 23:14:40
簡単すぐるからパス

925:デフォルトの名無しさん
08/06/04 23:59:00
OSによっては簡単すぐるけど、一般にはそうでもないし、perlが最適だったりもする

>>923
OSを明かした方が適切な回答があるかもよ

926:デフォルトの名無しさん
08/06/05 00:09:17
> 924,925
レス、さんく
とりあえず find でフルパスは取得できよ。
あと、タイムスタンプなんだよね。
OSはAIXでkshでつ

927:デフォルトの名無しさん
08/06/05 01:22:49
AIXは、statもないし、lsに-Tもないんじゃないかな。
テキストファイルだけなら diff -c で /dev/null と比較して、
先頭の行を加工すれば何とか取得できるかもしれない。

けど、perl をすすめる。

928:デフォルトの名無しさん
08/06/05 01:39:28
>927
ありがと
よく似たコマンドでistatってのがあったけど
月表示が英語なのよ・・・

$ istat bbb
デバイス 10/8 上の Inode 89 ファイル
保護 : rw-r--r--
所有者 : 8(*****) グループ : 0(system)
リンク・カウント : 1 長さ 4 バイト

最後の更新: Thu Jun 5 01:35:24 JST 2008
最後の修正: Thu Jun 5 01:35:24 JST 2008
最後のアクセス: Thu Jun 5 01:35:24 JST 2008

929:デフォルトの名無しさん
08/06/05 02:12:17
ひとつ教えてください。
ファイルからデータを収集して
txtファイルに出力するようなシェルを作成しているのですが
整形がうまくいきません。

touch test.txt
echo "ABCDEF 1_0_2_3" >> test.txt
echo "LMN 3_2_4_5" >> test.txt

当然中身は
ABCDEF 1_0_2_3
LMN 3_2_4_5
となるんですが

ABCDEF 1_0_2_3
LMN 3_2_4_5
としたいんです。

何かいい方法ありませんか?
tabのような整形方法を考えたんですがうまく揃わないので
文字数指定する方法あれば教えていただきたいんですが。。。
(C言語のprint文での %10s のようなのができれば理想ですが)

930:デフォルトの名無しさん
08/06/05 02:12:56
ずれーたorz
番号のところが揃うようにしたいです。
ご教授ください。

931:デフォルトの名無しさん
08/06/05 02:14:20
なら、12種類しかないんだから、caseで分岐して、
一致した月の数字を返すっていう関数書けばいいんじゃ?


932:デフォルトの名無しさん
08/06/05 02:20:01
>>929
OSによっては、まさにprintfがあるけどな。

933:デフォルトの名無しさん
08/06/05 02:24:10
# echo "ABCDEF 1_0_2_3" | gawk "{printf(\"%10s %s\n\",\$1,\$2);}" > test.txt
# echo "LMN 3_2_4_5" | gawk "{printf(\"%10s %s\n\",\$1,\$2);}" >> test.txt
# cat test.txt
  ABCDEF 1_0_2_3
    LMN 3_2_4_5



934:デフォルトの名無しさん
08/06/05 02:24:20
ファイルの比較するシェルを作りたいのですが、
うまくいきません。

file_list.txt
-- 内容 --
ABC
DEF
GHI


このファイルとフォルダ内の内容が一致するかチェックしたいのですが
何かいい方法ありませんか?

ls -Rをtxtファイルに吐き出してcmpを使う方法と
read line使った後ls -Rとgrepをつかって比較する方法を思いついたのですが、
もっと綺麗な方法ってあるでしょうか?


935:デフォルトの名無しさん
08/06/05 02:25:25
busyboxにprintfあったよ・・・・・orz

936:デフォルトの名無しさん
08/06/05 02:28:49
>>932
マジですかorz
調べたりなさ杉。ありがとうございます。

>>933
今現在確認できないので研究室についたら試してみます
ありがとうございました。


937:デフォルトの名無しさん
08/06/05 02:35:12
おまえら、いいかがんシェルを作るな。シェルスクリプトを作れ。

938:デフォルトの名無しさん
08/06/05 04:38:56
Cに似たシェルスクリプト言語ってある?

939:デフォルトの名無しさん
08/06/05 08:29:08
cshでスクリプトは書くな

940:デフォルトの名無しさん
08/06/05 08:41:31
外部コマンド呼ぶのにいちいちsystem()とか、それさえなくて
fork()とexecve()を駆使しなきゃいけないようなスクリプト言語だとしたら、
かなりいや。

941:デフォルトの名無しさん
08/06/05 09:05:21
while read Filenm
do
if [ -e $Filenm ] ; then
echo $Filenm" ○"
else
echo $Filenm" ×"
fi
done <file_list.txt

942:デフォルトの名無しさん
08/06/05 20:45:57
cat file_list.txt | group { Test-Path $_ }

943:デフォルトの名無しさん
08/06/06 09:47:16
>>940
どうして?

944:デフォルトの名無しさん
08/06/06 19:28:20
インタープリタ言語はスレ違いでしたね
スレタイがシェルスクリプトだもんな
すっかり勘違いしてた

945:デフォルトの名無しさん
08/06/07 18:48:20
cpioのマルチボリューム保存で1本目が終わると
2本目の前にデバイス名の入力を施すメッセージが表示されます。
その際、そのメッセージ(多分、標準エラー出力)を表示させないで
自前の処理で「2本目の保存を行いますか?(y/n)」みたいに行いたいのです。

標準エラー出力をどう扱うかが肝だと思うのですが、良いアイデアが浮かびません。

何か良いヒントはありませんでしょうか?(Bシェル(OS:Solaris))


946:デフォルトの名無しさん
08/06/07 19:35:53
つ expect

947:デフォルトの名無しさん
08/06/16 11:34:15
#!/bin/csh -f

set s=$1
set t=$2
set f=$3

cat $f | tail +$s | head -$t

exit 0
echo ------------------

以上を改良しろ、と言われました。みなさんならどうしますか?教えて下さい。

948:デフォルトの名無しさん
08/06/16 11:47:55
#!/bin/csh -f
tail +$1 $3 | head -$2

949:デフォルトの名無しさん
08/06/16 13:01:05
rm -f /bin/csh

950:デフォルトの名無しさん
08/06/16 13:49:14
>>949
Permission denied

951:デフォルトの名無しさん
08/06/16 14:14:52
以下のスクリプトで
echo をした時に
AAAeo kakikukeko sasisuseso
AAAituteto naninuneno hahihuheho
と表示されるのですが
どうすれば
tatituteto naninuneno hahihuhehoAAA
と表示できるのでしょう?
環境は実行シェルはbashです


FUGA="'AAA'"
awk '{print;}' hoge.txt | while read LINE; do
    MOGE=`echo "$LINE" | cut -d , -f 2-`
    echo "$MOGE""$FUGA"
done

hoge.txt
a,aiueo kakikukeko sasisuseso
b,tatituteto naninuneno hahihuheho



952:デフォルトの名無しさん
08/06/16 14:55:37
>>951
やりたいことが判らん。awkを使う理由が判らん。手元で再現できん。
つーか、折角awkを使うならawk -F, '{print $2 "AAA";}'じゃいかんの?

953:951
08/06/16 15:09:30
>>952
レスありがとうございます

やりたい事としては
ファイルから1行読み込んで1行をパースし
FUGAと連結した文字列を別のコマンドを実行させたい

です

1行の内容としては
aaaaa,hogehoge mogemoge aiueo

という風に書きましたが実際には
aaaa,SQL文
という感じで半角スペースやカンマが入ります



954:デフォルトの名無しさん
08/06/16 15:16:15
>>953
他人の話をよく聞きなさいって言われたことないか?
>952をよく読んで、為すべきことを為してから出直せ。
それから、自分の書いた文章を読み返す癖をつけた方がいい。
とてもじゃないが、他人に読んでもらう文章になっていないぞ。

955:デフォルトの名無しさん
08/06/16 15:48:40
>>954
>>952に書いてある内容は理解しています

    MOGE=`echo "$LINE" | cut -d , -f 2-`

の代わりとなる部分だと言うことは解っているのですが
>>953にも書いてある通りカンマ等が入ってしまう為記述が簡単な
    MOGE=`echo "$LINE" | cut -d , -f 2-`
を選びました

951にカンマ等が複数入る可能性があるという事を
書かなかったのはすみませんでした


956:デフォルトの名無しさん
08/06/16 16:11:07
cut -d',' -f2-

957:デフォルトの名無しさん
08/06/16 16:18:10
~> L="123,uio poi"
~> LB=`echo $L | cut -d',' -f2-`
~> echo $LB
uio poi
~>

958:デフォルトの名無しさん
08/06/16 17:05:34
違ったか・・・

959:デフォルトの名無しさん
08/06/16 21:03:53
tr -d '\015' < hoge.txt | awk ...


960:デフォルトの名無しさん
08/06/17 11:26:10
#!/bin/csh -f

set com=$0

if ($#argv < 1 || $#argv > 3) then
echo Usage:$com start_line total_lines '[file_name]'
exit 1
endif
if ($#argv == 2) then
set s=$1
set t=$2
tail +$s | head -$t
else
set s=$1
set t=$2
set f=$3
cat $f | tail +$s | head -$t
endif

exit 0
echo ------------------

これだとエラーがでます。どなたか改良してください。お願いします。


961:デフォルトの名無しさん
08/06/17 11:27:38
酷いマルチ

962:デフォルトの名無しさん
08/06/17 13:28:46
bashで
while read LINE; do
echo $LINE
done < ファイル

とするとファイルに含まれてるタブ文字が
半角スペースに変換されて表示されるのですが
そのまま取り出したい場合どうすればいいのでしょう?

cat ファイル | whileやfor LINE in `cat ファイル`等はやってみました


963:デフォルトの名無しさん
08/06/17 13:57:10
echo "$LINE"


964:デフォルトの名無しさん
08/06/17 14:05:16
>>963
うまくいきました
ありがとう

そんな単純な事に気づかなかったとはorz


965:デフォルトの名無しさん
08/06/30 21:30:18
KORNシェルの質問です。よろしくお願いします。

テキストファイル

id=tanaka age=25
id=takahashi age=2           
id=suzuki age=44



id age
---------------------
id=tanaka age=25
id=takahashi age=2          
id=suzuki age=44

にしたい(体裁を整えたい)です。$@を使ってできますか?
変数wkにabc=e があったとして、=があるかどうかわかりますか?
grepやcutコマンドは変数を対象に使えませんよね・・?

966:デフォルトの名無しさん
08/06/30 21:42:13
訂正です。体裁が整ってない。
idなら10文字以下でもスペースで10文字にして(これはtypedef使いました)
=の前を見出しに出力して、=の後を----の下に書きたいんです。

id age
---------------------
tanaka    25
takahashi   2          
suzuki    44

よろしくお願いします

967:デフォルトの名無しさん
08/06/30 23:25:03
IFS="=$IFS"
FIRST=t

while read line
do
    set -- $line
    if [ "$FIRST" ]
    then
        printf "%-10s %s\n" "$1" "$3"
        echo "---------------------"
        FIRST=
    fi
    printf "%-10s %2d\n" "$2" "$4"
done

968:デフォルトの名無しさん
08/06/30 23:38:57
>>967san
有難うございます!今試せないので明日、速攻でやってみます!



969:デフォルトの名無しさん
08/07/04 23:36:23
質問させてください。
diffの結果を見易く整形するツール等はありますでしょうか。
環境はCENTOSです。よろしくお願いします。

970:969
08/07/04 23:37:57
すいません。追記します。
シェルスクリプト内で使いたいので、
ツールでもコマンド的なものだとありがたいです。

971:デフォルトの名無しさん
08/07/05 00:17:24
diff -u


972:デフォルトの名無しさん
08/07/05 00:19:45
>>969
> diffの結果を見易く整形

kwsk



973:デフォルトの名無しさん
08/07/05 01:23:42
>972
このファイルだけサイズが違いますよとか
このファイルはこっちにありませんよとかが希望です。
ls -Rlaの結果をファイルにリダイレクトしてます

974:デフォルトの名無しさん
08/07/05 07:42:01
ファイルの差分はいらないのね

find dirA -exec wc -c {}; > /tmp/A
find dirB -exec wc -c {}; > /tmp/B
diff /tmp/A /tmp/B

あるいは単純に
diff -r --brief dirA dirB 2>&1


975:デフォルトの名無しさん
08/07/07 14:20:19
私はこんなスクリプト作ってる。
--
#!/bin/sh -f
DIFF="/bin/diff -u"

lsd()
{
find $1 -type f -ls | awk '{printf("%10d %s %2s %5s %s\n", $7, $8, $9, $10, $11);}' | sort +4
}

lsd $1 | sed -e "s- $1- $2-" > /tmp/$$
lsd $2 | $DIFF /tmp/$$ -
rm /tmp/$$
--
これで一応ファイルサイズとタイムスタンプも比較できる。

976:デフォルトの名無しさん
08/07/07 23:59:08
>>975
・空白のあるファイル名の扱い
・日付の出力形式の仮定
に問題。




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