シェルスクリプト相談室

このエントリーをはてなブックマークに追加
933デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/06/05(木) 02:24:20
ファイルの比較するシェルを作りたいのですが、
うまくいきません。

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


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

ls -Rをtxtファイルに吐き出してcmpを使う方法と
read line使った後ls -Rとgrepをつかって比較する方法を思いついたのですが、
もっと綺麗な方法ってあるでしょうか?
935デフォルトの名無しさん:2008/06/05(木) 02:25:25
busyboxにprintfあったよ・・・・・orz
936デフォルトの名無しさん:2008/06/05(木) 02:28:49
>>932
マジですかorz
調べたりなさ杉。ありがとうございます。

>>933
今現在確認できないので研究室についたら試してみます
ありがとうございました。
937デフォルトの名無しさん:2008/06/05(木) 02:35:12
おまえら、いいかがんシェルを作るな。シェルスクリプトを作れ。
938デフォルトの名無しさん:2008/06/05(木) 04:38:56
Cに似たシェルスクリプト言語ってある?
939デフォルトの名無しさん:2008/06/05(木) 08:29:08
cshでスクリプトは書くな
940デフォルトの名無しさん:2008/06/05(木) 08:41:31
外部コマンド呼ぶのにいちいちsystem()とか、それさえなくて
fork()とexecve()を駆使しなきゃいけないようなスクリプト言語だとしたら、
かなりいや。
941デフォルトの名無しさん:2008/06/05(木) 09:05:21
while read Filenm
do
if [ -e $Filenm ] ; then
echo $Filenm" ○"
else
echo $Filenm" ×"
fi
done <file_list.txt
942デフォルトの名無しさん:2008/06/05(木) 20:45:57
cat file_list.txt | group { Test-Path $_ }
943デフォルトの名無しさん:2008/06/06(金) 09:47:16
>>940
どうして?
944デフォルトの名無しさん:2008/06/06(金) 19:28:20
インタープリタ言語はスレ違いでしたね
スレタイがシェルスクリプトだもんな
すっかり勘違いしてた
945デフォルトの名無しさん:2008/06/07(土) 18:48:20
cpioのマルチボリューム保存で1本目が終わると
2本目の前にデバイス名の入力を施すメッセージが表示されます。
その際、そのメッセージ(多分、標準エラー出力)を表示させないで
自前の処理で「2本目の保存を行いますか?(y/n)」みたいに行いたいのです。

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

何か良いヒントはありませんでしょうか?(Bシェル(OS:Solaris))
946デフォルトの名無しさん:2008/06/07(土) 19:35:53
つ expect
947デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/06/16(月) 11:47:55
#!/bin/csh -f
tail +$1 $3 | head -$2
949デフォルトの名無しさん:2008/06/16(月) 13:01:05
rm -f /bin/csh
950デフォルトの名無しさん:2008/06/16(月) 13:49:14
>>949
Permission denied
951デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/06/16(月) 14:55:37
>>951
やりたいことが判らん。awkを使う理由が判らん。手元で再現できん。
つーか、折角awkを使うならawk -F, '{print $2 "AAA";}'じゃいかんの?
953951:2008/06/16(月) 15:09:30
>>952
レスありがとうございます

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

です

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

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

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

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

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

951にカンマ等が複数入る可能性があるという事を
書かなかったのはすみませんでした
956デフォルトの名無しさん:2008/06/16(月) 16:11:07
cut -d',' -f2-
957デフォルトの名無しさん:2008/06/16(月) 16:18:10
~> L="123,uio poi"
~> LB=`echo $L | cut -d',' -f2-`
~> echo $LB
uio poi
~>
958デフォルトの名無しさん:2008/06/16(月) 17:05:34
違ったか・・・
959デフォルトの名無しさん:2008/06/16(月) 21:03:53
tr -d '\015' < hoge.txt | awk ...
960デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/06/17(火) 11:27:38
酷いマルチ
962デフォルトの名無しさん:2008/06/17(火) 13:28:46
bashで
while read LINE; do
echo $LINE
done < ファイル

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

cat ファイル | whileやfor LINE in `cat ファイル`等はやってみました
963デフォルトの名無しさん:2008/06/17(火) 13:57:10
echo "$LINE"
964デフォルトの名無しさん:2008/06/17(火) 14:05:16
>>963
うまくいきました
ありがとう

そんな単純な事に気づかなかったとはorz
965デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/06/30(月) 21:42:13
訂正です。体裁が整ってない。
idなら10文字以下でもスペースで10文字にして(これはtypedef使いました)
=の前を見出しに出力して、=の後を----の下に書きたいんです。

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

よろしくお願いします
967デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/06/30(月) 23:38:57
>>967san
有難うございます!今試せないので明日、速攻でやってみます!

969デフォルトの名無しさん:2008/07/04(金) 23:36:23
質問させてください。
diffの結果を見易く整形するツール等はありますでしょうか。
環境はCENTOSです。よろしくお願いします。
970969:2008/07/04(金) 23:37:57
すいません。追記します。
シェルスクリプト内で使いたいので、
ツールでもコマンド的なものだとありがたいです。
971デフォルトの名無しさん:2008/07/05(土) 00:17:24
diff -u
972デフォルトの名無しさん:2008/07/05(土) 00:19:45
>>969
> diffの結果を見易く整形

kwsk

973デフォルトの名無しさん:2008/07/05(土) 01:23:42
>972
このファイルだけサイズが違いますよとか
このファイルはこっちにありませんよとかが希望です。
ls -Rlaの結果をファイルにリダイレクトしてます
974デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/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デフォルトの名無しさん:2008/07/07(月) 23:59:08
>>975
・空白のあるファイル名の扱い
・日付の出力形式の仮定
に問題。

977デフォルトの名無しさん:2008/07/09(水) 19:42:28
sedの置換元の文字列ををコマンドラインで直接指定したいのですが、やり方が見つからなくて困っています。

sed -e 's/^.*\_//' ここに文字列を指定

という風にやりたいのですが、何かやり方ありますでしょうか?
978デフォルトの名無しさん:2008/07/09(水) 21:30:44
>>977
echo "ここに文字列を指定" | sed -e 's/^.*\_//'

じゃだめ?
979デフォルトの名無しさん:2008/07/09(水) 22:14:47
$ cat /usr/local/bin/sed
#!/bin/bash
OPT="$2"
shift 2
echo "$@" |/bin/sed -e "$OPT"

$ export PATH=/usr/local/bin:$PATH

$ sed -e 's/^.*\_//' ここに文字列_を指定
を指定
980デフォルトの名無しさん:2008/08/06(水) 00:09:37
シェルからのPL/SQL呼び出しに詳しい方に質問ですが、

【SQLプラス接続コード】 EOF
@test.sql
EOF

###ここに###



上のようにPL/SQLに接続して以下のようなPL/SQLを実行させると、

-----------------------
DECLEAR

【宣言】

BEGIN

【処理】

END
-----------------------
って形になると思うのですが、このPL/SQL内でINTOとか使って
変数に入れた値を呼び出し元のシェル内に返してやることって可能なんでしょうか?

上の例だと###ここに###って部分にPL/SQL内の変数をそのまま入れたいのですが。
981デフォルトの名無しさん:2008/08/06(水) 00:47:45
PL/SQLってゆうのはよく知らんけど、
var1=val1; var2=val2; ... みたいな出力ができるんなら、
eval `接続 <<EOF
hogehoge
EOF
`
とかすればいいのでは?
982デフォルトの名無しさん
>>981
・標準出力に出力し、それを変数にリダイレクト。
・ファイルに出力し、後続のshellスクリプトで解析。(init.oraの変更が必要)
・素直にperlなど、DB接続機能を持ったスクリプト言語を使う。