# 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をつかって比較する方法を思いついたのですが、
もっと綺麗な方法ってあるでしょうか?
busyboxにprintfあったよ・・・・・orz
936 :
デフォルトの名無しさん:2008/06/05(木) 02:28:49
>>932 マジですかorz
調べたりなさ杉。ありがとうございます。
>>933 今現在確認できないので研究室についたら試してみます
ありがとうございました。
おまえら、いいかがんシェルを作るな。シェルスクリプトを作れ。
Cに似たシェルスクリプト言語ってある?
cshでスクリプトは書くな
外部コマンド呼ぶのにいちいちsystem()とか、それさえなくて
fork()とexecve()を駆使しなきゃいけないようなスクリプト言語だとしたら、
かなりいや。
while read Filenm
do
if [ -e $Filenm ] ; then
echo $Filenm" ○"
else
echo $Filenm" ×"
fi
done <file_list.txt
cat file_list.txt | group { Test-Path $_ }
インタープリタ言語はスレ違いでしたね
スレタイがシェルスクリプトだもんな
すっかり勘違いしてた
945 :
デフォルトの名無しさん:2008/06/07(土) 18:48:20
cpioのマルチボリューム保存で1本目が終わると
2本目の前にデバイス名の入力を施すメッセージが表示されます。
その際、そのメッセージ(多分、標準エラー出力)を表示させないで
自前の処理で「2本目の保存を行いますか?(y/n)」みたいに行いたいのです。
標準エラー出力をどう扱うかが肝だと思うのですが、良いアイデアが浮かびません。
何か良いヒントはありませんでしょうか?(Bシェル(OS:Solaris))
つ 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 ------------------
以上を改良しろ、と言われました。みなさんならどうしますか?教えて下さい。
#!/bin/csh -f
tail +$1 $3 | head -$2
rm -f /bin/csh
以下のスクリプトで
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
>>951 やりたいことが判らん。awkを使う理由が判らん。手元で再現できん。
つーか、折角awkを使うならawk -F, '{print $2 "AAA";}'じゃいかんの?
953 :
951:2008/06/16(月) 15:09:30
>>952 レスありがとうございます
やりたい事としては
ファイルから1行読み込んで1行をパースし
FUGAと連結した文字列を別のコマンドを実行させたい
です
1行の内容としては
aaaaa,hogehoge mogemoge aiueo
という風に書きましたが実際には
aaaa,SQL文
という感じで半角スペースやカンマが入ります
>>953 他人の話をよく聞きなさいって言われたことないか?
>952をよく読んで、為すべきことを為してから出直せ。
それから、自分の書いた文章を読み返す癖をつけた方がいい。
とてもじゃないが、他人に読んでもらう文章になっていないぞ。
>>954 >>952に書いてある内容は理解しています
MOGE=`echo "$LINE" | cut -d , -f 2-`
の代わりとなる部分だと言うことは解っているのですが
>>953にも書いてある通りカンマ等が入ってしまう為記述が簡単な
MOGE=`echo "$LINE" | cut -d , -f 2-`
を選びました
951にカンマ等が複数入る可能性があるという事を
書かなかったのはすみませんでした
cut -d',' -f2-
~> L="123,uio poi"
~> LB=`echo $L | cut -d',' -f2-`
~> echo $LB
uio poi
~>
違ったか・・・
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 ------------------
これだとエラーがでます。どなたか改良してください。お願いします。
酷いマルチ
bashで
while read LINE; do
echo $LINE
done < ファイル
とするとファイルに含まれてるタブ文字が
半角スペースに変換されて表示されるのですが
そのまま取り出したい場合どうすればいいのでしょう?
cat ファイル | whileやfor LINE in `cat ファイル`等はやってみました
echo "$LINE"
>>963 うまくいきました
ありがとう
そんな単純な事に気づかなかったとはorz
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コマンドは変数を対象に使えませんよね・・?
訂正です。体裁が整ってない。
idなら10文字以下でもスペースで10文字にして(これはtypedef使いました)
=の前を見出しに出力して、=の後を----の下に書きたいんです。
id age
---------------------
tanaka 25
takahashi 2
suzuki 44
よろしくお願いします
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です。よろしくお願いします。
970 :
969:2008/07/04(金) 23:37:57
すいません。追記します。
シェルスクリプト内で使いたいので、
ツールでもコマンド的なものだとありがたいです。
diff -u
>>969 > diffの結果を見易く整形
kwsk
>972
このファイルだけサイズが違いますよとか
このファイルはこっちにありませんよとかが希望です。
ls -Rlaの結果をファイルにリダイレクトしてます
ファイルの差分はいらないのね
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
私はこんなスクリプト作ってる。
--
#!/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/$$
--
これで一応ファイルサイズとタイムスタンプも比較できる。
>>975 ・空白のあるファイル名の扱い
・日付の出力形式の仮定
に問題。
sedの置換元の文字列ををコマンドラインで直接指定したいのですが、やり方が見つからなくて困っています。
sed -e 's/^.*\_//' ここに文字列を指定
という風にやりたいのですが、何かやり方ありますでしょうか?
>>977 echo "ここに文字列を指定" | sed -e 's/^.*\_//'
じゃだめ?
$ 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/^.*\_//' ここに文字列_を指定
を指定
シェルからのPL/SQL呼び出しに詳しい方に質問ですが、
【SQLプラス接続コード】 EOF
@test.sql
EOF
###ここに###
上のようにPL/SQLに接続して以下のようなPL/SQLを実行させると、
-----------------------
DECLEAR
【宣言】
BEGIN
【処理】
END
-----------------------
って形になると思うのですが、このPL/SQL内でINTOとか使って
変数に入れた値を呼び出し元のシェル内に返してやることって可能なんでしょうか?
上の例だと###ここに###って部分にPL/SQL内の変数をそのまま入れたいのですが。
PL/SQLってゆうのはよく知らんけど、
var1=val1; var2=val2; ... みたいな出力ができるんなら、
eval `接続 <<EOF
hogehoge
EOF
`
とかすればいいのでは?
>>981 ・標準出力に出力し、それを変数にリダイレクト。
・ファイルに出力し、後続のshellスクリプトで解析。(init.oraの変更が必要)
・素直にperlなど、DB接続機能を持ったスクリプト言語を使う。