[過去ログ] シェルスクリプト総合 その27 (1002レス)
1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
57
(3): 名無しさん@お腹いっぱい。 [sage] 2018/05/17(木) 08:37:52 AAS
すいません。
いま、誤ってログインシェルの設定ファイル(~/.bashrc)を空にしてしまいました。
しかし、まだログアウトしていないため、今稼動しているシェルはその設定を保持しています。
例えばエイリアスを知りたければ`alias`とやればいいはずですが、ほかにもシェル関数や環境変数なども読み込んでいます。
これらの値を今取得するにはどうすればいいですかね。
72
(6): 名無しさん@お腹いっぱい。 [] 2018/05/21(月) 09:50:43 AAS
/home直下にhoge00〜hoge99までの名前がついているディレクトリがあるとします
他にも/home直下にはディレクトリが存在します
ディレクトリ名を検索しながら、hoge00-hoge99の名前にマッチした複数のディレクトリの中の、ある特定のディレクトリに既存のファイルであるtestという名前のファイルをコピーしたいです
ある特定の、という意味は
・hoge○○ディレクトリ直下にtestというファイルがあったら→スルー
・testというファイル名のファイルがhoge○○直下になければ、既存のtestを該当hoge○○ディレクトリ直下にコピー

このようなシェルスクリプトを書きたいのですが教えてください
77
(3): 名無しさん@お腹いっぱい。 [sage] 2018/05/21(月) 10:19:49 AAS
filehoge="test"
[ ! -f "$filehoge" ] exit 1
seq -f 'hoge%02g' 1 99 | while read hogedir
do
[ -d "$hogedir" ] && [ ! -f "$hogedir/$filehoge" ] && { cp "$filehoge" "$hogedir"; echo "copied into $hogedir"; }
done
82
(3): 名無しさん@お腹いっぱい。 [sage] 2018/05/21(月) 10:42:46 AAS
findは存在を確認するのは楽だろうけど、存在しないことを確認するのは面倒じゃない?
120
(3): 名無しさん@お腹いっぱい。 [sage] 2018/05/24(木) 20:05:30 AAS
$ cat a.file > b.file
とやるのと
$ cp a.file b.file
とやるので違いが生じる場合はありますか?
133
(3): 名無しさん@お腹いっぱい。 [sage] 2018/05/26(土) 04:09:24 AAS
お知恵お借りしたいです。

awk '($3 !~ /ここにパイプ区切りで記述したい/) && ($4 ~ /01/)' output.txt

上記のawkで条件に当てはまるファイルを絞り込みたいのですが
その1 別ファイルからのawkの結果を $aaa に設定してある
その2 $aaa は複数列の出力なので set コマンドにて位置パラメータに分けてある
その3 各変数を展開して文字列としてパイプで区切ってawkを使いたい。

以上のようなことをやってみたのですがどうもうまく行きません。
また、違うやり方もあるようでしたらご教示いただけるとありがたいです。
よろしくお願いします。
136
(3): 名無しさん@お腹いっぱい。 [sage] 2018/05/26(土) 07:13:03 AAS
ごめん俺の理解が悪いと思うのだがあなたのやりたいことが見えない。
他の人にまかせるわ。
もしくはZZZ.txtの内容をプライバシーに障らない程度に具体的に教えてほしい。
「ZZZ.txtからgrepで取り出した値をパイプで連結して処理する」という文言からは
ZZZ.txtには命令が一行ずつ書かれているように受け取れるのだが、そうじゃないよね。
それとも「パイプで繋ぐ」というのはシェルのパイプ実行ではなく単に文字列としてパイプを区切りとして使うという意味?
もしそうなら
$ cat ZZZ.txt | grep XXX | tr '\n' '|' | sed 's/|$//1'
↑こういうので行けるけど。違うでしょ?
212
(3): 名無しさん@お腹いっぱい。 [sage] 2018/06/06(水) 09:02:34 AAS
aaa=(888 犬 `date +"%Y%m%d"010000 -d last-sunday`)
bbb=(777 猫 `date +"%Y%m%d"150000 -d last-Saturday`)
ccc=(666 鳥 `date +"%Y%m%d"000000 -d last-friday`)

for hoge in "$aaa" "$bbb" "$ccc"
do
if [ -e ~/${hoge[1]}_${hoge[2]:0:4}_${hoge[2]:4:2}_${hoge[2]:6:2}.mp4 ]; then
exit 0
else
ffmpeg -i ~/output/${hoge[2]}-${hoge[0]}.aac ~/${hoge[1]}_${hoge[2]:0:4}_${hoge[2]:4:2}_${hoge[2]:6:2}.mp4
fi
done

こんな感じのスクリプト書いたのですが、配列が展開してくれません。
どうすれば変数に入れた配列が機能するでしょうか
アドバイスお願いします。
248
(3): 名無しさん@お腹いっぱい。 [sage] 2018/06/07(木) 02:03:34 AAS
>>212
for hoge in "$aaa" "$bbb" "$ccc"
"$aaa" "$bbb" "$ccc"は、最初のアイテムを示すだけ(888, 777, 666)で間違い
"${aaa[@]"が正しいもしくはとしたかったのだろうが、だったらforの機能的にも変数をArrayにする必要はないだろう。その記述以下でなんかするのでないなら
aaa/bbb/cccは単なる文字列として、for内で必要となったらArrayに分解すれば簡単に目的は達成するだろう
(てか、配列にするならaaa/bbb/cccなんて個々の変数じゃなくてそれこそそれを配列にすればいいのにと思うけど)

aaa="888 犬 `date +"%Y%m%d"010000 -d last-sunday`"
...
for fuga in "$aaa" "$bbb" "$ccc"
do
hoge=$($fuga)
if [ -e ~/${hoge[1]}_${hoge[2]:0:4}_${hoge[2]:4:2}_${hoge[2]:6:2}.mp4 ]; then
...
282
(5): 名無しさん@お腹いっぱい。 [] 2018/06/08(金) 23:18:13 AAS
Excelから出力したCSVのように一行(?)の中に改行が含まれた
データを扱うにはどうしたら良いでしょうか?

もう少し具体的に書きます。

カンマ区切りのCSVデータだと仮定して、
シェルスクリプトの中に関数を一行ごとに呼び出し、
列を引数に対応させたいです。

例えば以下のような内容のファイルがあったとして
a1,a2,a3,a4
b1,b2,b3,b4
c1,c2,c3,c4

syori "a1" "a2" "a3" "a4"
syori "b1" "b2" "b3" "b4"
syori "c1" "c2" "c3" "c4"

という風にsyori関数を呼び出したいのです。

ただし実際には各項目(a1等の部分)にExcelから出力したデータのように
改行やカンマやダブルクォートやシングルクォートや空白が入ることがあるのです
287
(4): 名無しさん@お腹いっぱい。 [sage] 2018/06/08(金) 23:31:03 AAS
>>285
285(1): 名無しさん@お腹いっぱい。 [sage] 2018/06/08(金) 23:23:17 AAS
>>283
rubyとかpythonでCSV処理用のライブラリを使うとか、
CSV処理用の専用ツール使うとか。
落とし穴が一杯あるので、シェルだけでやるのは危険。
危険は承知で環境依存させたくないので、
シェルスクリプト(POSIX)だけでやりたいのです
289
(5): 名無しさん@お腹いっぱい。 [sage] 2018/06/08(金) 23:57:15 AAS
邪道としては、改行コードとか\を絶対に使われない文字に置換して最後にまた戻すとかやったな
アルメニア文字とかに置換するんやで
323
(5): 名無しさん@お腹いっぱい。 [sage] 2018/06/10(日) 02:20:54 AAS
U+001EやU+001Fを区切り文字として利用してる方いらっしゃいますか?
結構便利(絶対に他の文字と衝突しない)だと思うんですが、そういうシェルスクリプトを見たことがありません。
345
(3): 名無しさん@お腹いっぱい。 [sage] 2018/06/10(日) 16:07:14 AAS
> "Excelから出力したCSVのように" 一行(?)の中に改行が含まれた
> データを扱うにはどうしたら良いでしょうか?

> カンマ区切りのCSVデータだと "仮定して" 、

> 今回はCSVではありませんが、

こう書いてあるのに、CSV形式だって思い込むのは
頭が悪いと思います。
422
(3): 名無しさん@お腹いっぱい。 [sage] 2018/06/10(日) 22:50:59 AAS
>>420
420(2): 名無しさん@お腹いっぱい。 [sage] 2018/06/10(日) 22:49:14 AAS
もう一から説明しないと、情報処理の基本すらわかってないようなので
バカバカしすぎだけど、

・改行がデータ中とレコードの終わりを示すのが混在している
・シェルスクリプトは基本、改行は改行でしかなく、データ中なんて知らんただの一行=レコードがブッタ切られる
・データ中の改行を他のナニかに変えれば、シェルスクリプトは一行=1レコードと認識する

前処理:データ中の改行だけをナニかに変える
本処理:改行が終端の一行=1レコードを処理する
後処理:ナニかに変えたのを改行に戻す

たった、これだけのことをなぜ理解できないでトンチンカンなことばっかり言うのか。前処理をsedでできるなんて言ったことないぞ(できるかもだが、それはもっと面倒なの俺は考えんw)。後処理はsedでできることは馬鹿でもわかるだろうにぃぃぃ
に補足すると、
(POSIXの範囲では)readは必ず改行コードでぶった切られる
435
(3): 名無しさん@お腹いっぱい。 [sage] 2018/06/10(日) 23:13:46 AAS
>>433
433(1): 名無しさん@お腹いっぱい。 [sage] 2018/06/10(日) 23:05:23 AAS
>>428
それは元々のデータがそうであるってこと?そんなんだったら別にこのスレで話題にするようなもんじゃないだろう
いつからそんなのが前提になってるねんwなんかムチャクチャぶりが...ww
> それは元々のデータがそうであるってこと?

ちょっと違うな
「元々のデータがそうであってもよい」ってこと

元々のデータ形式について指定はないのだから
(処理するには効率の悪い)CSVデータでもOKだし、
どんなデータでもよい

そのデータ形式も含めて、
どうしたらいいでしょうか?という話だ
513
(4): 名無しさん@お腹いっぱい。 [sage] 2018/06/11(月) 18:49:50 AAS
こいつもしかしてこの間の「標準入力と標準エラー出力を同時に操作したい」のアホか。
521
(8): 名無しさん@お腹いっぱい。 [sage] 2018/06/12(火) 11:55:23 AAS
>>519
519(2): 名無しさん@お腹いっぱい。 [sage] 2018/06/12(火) 10:53:58 AAS
普通にできるぞ
じゃあ、これ相当のことをやってみて

cat /etc/password | grep /bin/bash | cut -d: -f1
(なんかブロックされたからパスワードを大文字にしてる)

ここまで簡潔に書ける言語をシェルスクリプト以外しらない
シェルスクリプトは(特定の用途に対して)最善だから使ってるんだよ
538
(3): 名無しさん@お腹いっぱい。 [sage] 2018/06/12(火) 18:46:13 AAS
俺はレスしただけだけど?
>>529
529(2): 名無しさん@お腹いっぱい。 [sage] 2018/06/12(火) 12:44:23 AAS
>>395
>>396
多分\エスケープ云々は途中でなんらか処理をする時にRFC準拠のエスケープだと不都合だからじゃないかな
「Mika says "I'm Happy"」という文を一つのフィールドとして処理するとき
RFC準拠だと
「Mika says ""I'm Happy""」になるけど、例えばこれをsed(1)やらawk(1)に通したいと思ったときは
「Mika says \"I'm Happy\"」という形にしたほうが処理しやすいでしょう?

そういうことなんじゃないかな。
が書かなければ、この話をすることもなかった
551
(3): 名無しさん@お腹いっぱい。 [sage] 2018/06/12(火) 19:39:25 AAS
問題定義をはっきりせずに、回答に対して一方的にダメ出ししてるから当たり前だろ。
>>521 だって awk や perl の解は >>521 とほぼ同程度の記述量なのに
(GECOS に /bin/bash とか書いてあっても誤動作しないという点ではむしろ優れてる)
「シェルスクリプト以外しらない」とかいう視野の狭さを撤回しないし。

ほぼすべてのプログラマーにとってシェルスクリプトってのは
第二・第三言語であって、シェルスクリプトが最適な用途なら使うけど、
そうじゃない場合があることは当然知ってて、
こんな風に威張って使うものじゃないんだよ。

インフラ担当ならシェルスクリプトが第一言語ってのもありうるけど、
そういう場合にはこんなに威張らないよなあ。
563
(3): 名無しさん@お腹いっぱい。 [sage] 2018/06/12(火) 23:46:19 AAS
>>559
559(1): 名無しさん@お腹いっぱい。 [sage] 2018/06/12(火) 23:19:14 AAS
>>551
> >>521 だって awk や perl の解は >>521 とほぼ同程度の記述量なのに
> (GECOS に /bin/bash とか書いてあっても誤動作しないという点ではむしろ優れてる)

いや、そんなことドヤ顔で言われましても・・・
4文字追加で終わりだし

cat /etc/password | grep ':/bin/bash$' | cut -d: -f1

減らそうと思えば減らせるし

grep ':/bin/bash$' /etc/password | cut -d: -f1

あれあれ、じゃあこれ↑は、"grep向き" の問題ってことですかね?w

俺が言ってるシェルスクリプト向きの問題っていうのは
既存のコマンドの実行と組み合わせが簡単に実行できるってことだよ
> あれあれ、じゃあこれ↑は、"grep向き" の問題ってことですかね?w

勿論そうだよ。
正規表現で書ける条件だったから、grepでうまくいった。
世の中には正規表現で書けない条件とかも当然あって、そういう場合
perlやawkなら自明にかけるけど、スクリプト言語使わずに
シェルだけで書こうとすると面倒だったりする。

> 俺が言ってるシェルスクリプト向きの問題っていうのは
> 既存のコマンドの実行と組み合わせが簡単に実行できるってことだよ

それに反対してる人は誰もいないと思うよ。
それこそがシェルが特化している応用分野なわけで。
しかし>>521はそれを示す例題としてはよろしくない。
他の言語ならコマンドの組み合わせとかせずに容易に解ける問題だからね。
577
(3): 名無しさん@お腹いっぱい。 [sage] 2018/06/13(水) 02:31:02 AAS
>>571
571(1): 名無しさん@お腹いっぱい。 [sage] 2018/06/13(水) 01:27:58 AAS
>>521
grep /bin/bash </etc/password | cut -d: -f1
入力側のリダイレクトって読みにくいので、自分もcatで書くかも
610
(3): 名無しさん@お腹いっぱい。 [sage] 2018/06/14(木) 20:52:33 AAS
findでexecオプションの引数のあとにシェルに渡すパイプを付けるとexecに渡したコマンドがシグナル13パイプ破壊を出してくるんですけど
どうにかなりませんかね。
今のところ/dev/nullに標準エラー出力を捨てることで解決してるんですけども。
find . -exec basename \{\} \; | head
↑これで再現するはずです。
解決するときはできればPOSIXの範囲でやりたいです。findのGNU拡張で解決できるならそれでもいいんですが
メインPCがOS Xなので、最低でもBSD拡張、さらに言えばPOSIXに限定してほしいです すいません。
613
(3): 名無しさん@お腹いっぱい。 [sage] 2018/06/14(木) 22:18:48 AAS
なにか最近やけに POSIX にこだわってる奴が多いが同一人物か?
621
(3): 619 [sage] 2018/06/14(木) 22:51:53 AAS
すまん間違えて送信しちゃった
$ find /etc -exec sh -c 'basename {}' \; | head
これでどうだろう。
-quitオプションはPOSIXの範疇ではないけどこれはPOSIXに準拠してる
ちなみに>>610のコマンドラインはDebian GNU/Linuxのfind 4.7で再現した。
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.051s