X



トップページLinux
191コメント59KB
Bashでプログラミング [転載禁止]©2ch.net
0167login:Penguin
垢版 |
2018/08/18(土) 00:38:01.74ID:hWfi1+lO
素直にUnix2dos、dos2unix使おう、な?
0168login:Penguin
垢版 |
2019/05/21(火) 23:09:17.57ID:oXRLq/xt
eval使って文字列内で実行するコマンドの返却値も標準出力も取りたいんですがどうしたらいいですか?

evalに渡すのはcurlでhttp取得なんですがurlが変わるのでそこを変数から実行したいんですが$?はevalの結果でcurlのものが取れないんです
0169login:Penguin
垢版 |
2020/01/02(木) 23:47:15.29ID:Vb52hemx
mysqlで特定の接頭辞がつくテーブルを検索し一括で削除したいのですが、クォーテション処理でうまく動作してくれません

grepで特定の接頭辞を検索してxargsで引数を渡してるのですが、xargs以降のエスケープしたりシングル・ダブルクォートと入れ替えたり
してるのですがうまくいきません。(-pで実行コマンドも確認しました。)
どなたかうまい書き方が分かる方いませんか?

mysql -u ユーザー名 -p -e 'SHOW TABLES FROM テーブル名' |grep 接頭辞_* |xargs -pI '{}' mysql -u ユーザー名 -p -e 'DROP TABLE テーブル名.\'{}\''
0170login:Penguin
垢版 |
2020/01/04(土) 17:21:02.76ID:E3O62f92
実際に使って知ってる人が助けてくれるんじゃないかと思って見てたけど来ないね。
まあ、「うまくいきません」だけじゃ無理か。
同様なことを SQLite でやるとしたらこんな感じかな。

dbname='test.db'
prefix='a'
echo .table | sqlite3 "$dbname" | tr -s ' ' '\012' |
sed -e "/^$prefix/!d" -e 's/^/drop table / ; s/$/;/ ;' |
sqlite3 "$dbname"

一般的な話として、引数で渡すためにはシェルの文法に従う必要があるから
それを大変だと思うならパイプを使えばいいと思うよ。
そういう使い方ができる場合はね。
3 日近く経ってるし、もう自分で解決してるよね。
0171login:Penguin
垢版 |
2020/01/05(日) 20:01:18.77ID:IPuUazgK
そもそも何が問題なのかわからんしなぁ
xargs使う理由もわからんし。俺ならそんな使い方しない。
たくさんのDROP TABLE文で埋め尽くされたSQLファイルを作ってを実行するとかさぁ
いやテーブル名羅列するだけでいいのか

grepでテーブル名引っ張るとかあり得んし。
SHOW TABLES FROMはこの場合に適切なんだっけ?
ああ、思い出したINFORMATION SCHEMA.TABLESとかあったなぁ

ともかくシェルスクリプトでやることじゃないよね
なんのために問い合わせが得意なRDBMS使ってるのさ?
0172login:Penguin
垢版 |
2020/01/06(月) 00:00:10.35ID:FtTPVMr3
「LIKE」句を使って、テーブル名で絞り込む。
最後に「meta」で終わるテーブルだけを表示したい

mysql> SHOW TABLES FORM wordpress LIKE "%meta";

「mysql show tables」で検索!
0173login:Penguin
垢版 |
2020/01/08(水) 21:40:32.43ID:l1od5Fw+
>>170, 171, 172
レスが遅くなって申し訳ありません。

CMSのインストール・削除のトライアンドエラーを
繰り返しているうちにテーブルが増えてきてしまった次第です。

やりたいことは、たくさんあるテーブルの中から
特定の接頭辞が付くテーブルだけを検索し削除したいです。

`drop table from 〇〇`でググるとかなりの割合の方が
bashでmysqlのコマンドを書いて力技で削除しているようでした。
当方もそれに習って色々試したのですが、
うまく動作せずに困っておりました。

こういった場合の無駄なくシンプルに削除するに
適切なコマンドはどうしたらよいのでしょうか?
0174login:Penguin
垢版 |
2020/01/08(水) 22:01:09.19ID:i7Ggys1A
なんでわざわざ手間がかかることするかね?自動化したいんじゃないだろ?
>>172みたいに該当するテーブル一覧でもだして、テキストエディタでも使って

drop table from table1
drop table from table2
drop table from table3

とかいうSQL作って、それを実行すりゃいいやん

シンプルにしたいんだろ?なんでわざわざxargsとか使って複雑なものを作ろうとしてるんだ

自動化したいなら↑の内容を一つづつ自動化しろ。いっぺんにやろうとすんなよ。

1. テーブル一覧を、drop table from ○○にしやすいようにテーブル名のみの出力にしろ
2. テーブル名のリストをdrop table from ○○のリストに変換するスクリプトを作れ
3. そのスクリプトの出力をmysqlコマンドに流せ

これだけだろ

> ググるとかなりの割合の方が
ググるとかなりの割合の方が馬鹿なだけ
0175login:Penguin
垢版 |
2020/01/09(木) 15:44:04.89ID:2gXyzp52
>>174
詳しいアドバイスありがとうございます!
本当に目から鱗です。

レスを見て2分で解決しました。
bashで力技で何時間も悪戦苦闘していたのが
悲しくなるくらい呆気なさでした。

本当に的確なアドバイスありがとうございます!
0176login:Penguin
垢版 |
2020/02/09(日) 12:27:07.05ID:TdA6OoR0
やってることが複雑になったと感じたら、最初に戻って考え直すことだ。
0177login:Penguin
垢版 |
2020/09/12(土) 14:17:52.81ID:uRW97DpA
バッシュの教科書って本買おうとしたけど、どこでも売り切れてて人気みたい
0178login:Penguin
垢版 |
2020/09/12(土) 15:05:18.55ID:f1Nswvqc
売れなかったから廃盤になるんやで
0179login:Penguin
垢版 |
2021/05/27(木) 01:02:31.31ID:m06R9ufF
こういったケースの空白文字がある場合のワンライナーはどう書けばいいですか??

・特定のディレクトリの中にある大量のファイル
・ファイルは全て同じ拡張子(.mp3)
・拡張子の直前にランダムのID何文字か付いている(例 -48antiO81n5Dq)
・全てのIDを取り除きリネームしたい
自分で作成したのですが最後のmvで躓いています。。
空白文字があるとそこでファイル名を分割されてうまく動作しません。
```bash
find . -type f -name "*.mp3"|grep "\-[a-zA-Z0-9-]*.mp3$"|sed "s/\-[a-zA-Z0-9-]*.mp3$/.mp3/"|xargs -n2 mv
```
0180login:Penguin
垢版 |
2021/05/27(木) 12:15:42.12ID:+SArHOBh
慣れてる人ならともかくリネームとかいう取り返しのつかない作業を
findとxargsでやりたくないな
俺ならリスト生成してmvするわ

mv "aaa aaa-48antiO81n5Dq.mp3" "aaa aaa.mp3"
mv "bbb bbb-48antiO81n5Dq.mp3" "bbb bbb.mp3"
mv "ccc ccc-48antiO81n5Dq.mp3" "ccc ccc.mp3"

みたいなシェルスクリプトを生成して実行する
実行前に目視で確認できるし、場合によっては手動で修正すればいいし
0181login:Penguin
垢版 |
2021/05/27(木) 13:40:55.77ID:EyeK5jGy
そもそもファイル名に空白が入ってなければ正しく動くのか?

aaa-48antiO81n5Dq.mp3
bbb-48antiO81n5Dq.mp3

というファイルがあったら sed の出力は

aaa.mp3
bbb.mp3

となるように思うのだが。いろいろつっこみたいが、とりあえず
find . -type f | xargs -d '\n' rename 's/-[a-zA-Z0-9-]*\.mp3$/.mp3/'
とするのが手っ取り早いと思う。
でもいきなりこんなことはしたくないね。
少なくともファイル名の衝突くらいはチェックしないと。
0182login:Penguin
垢版 |
2021/05/28(金) 15:39:24.70ID:RtkQ3VQL
どこに空白が入っているの?

例示して
0183login:Penguin
垢版 |
2021/06/04(金) 21:38:34.04ID:i0A1vKtk
空白入るなら、ダブルクォートをエスケープして入れてやればいい、と。

そもそもxargs使わんといけんの?
ふつうにこんなんじゃだめか?
find . -type f -name "*.mp3"|grep "\-[a-zA-Z0-9-]*.mp3$" \
| while read i;do \
echo mv -v \"$i\" \"`echo $i|sed '"s/\-[a-zA-Z0-9-]*.mp3$/.mp3/'`\"; \
done

で、そもそもfind使うなら、-nameじゃなくて-regex使った方がよくない?
grepはそのためだよな?(ってまあ、俺もgrep使うような気がするけどw)
で、さらにfind使うなら、xargsよりは-execの方がベターだ。
で、そうすっとこれが多分模範回答
find . -type f -regex "\./\-[a-zA-Z0-9-]*.mp3$" \
-exec echo mv -v \"{}\" \"`echo {}|sed 's/\-[a-zA-Z0-9-]*.mp3$/.mp3/'`\" \;

で、いずれもmvの前にechoを入れてるので、よさげだったら、echoを削って祈ってw
0184login:Penguin
垢版 |
2021/11/11(木) 18:26:58.40ID:wR3FRIZb
(´-`).。oO(>>1 は、いなくなったか…)
0185login:Penguin
垢版 |
2022/01/11(火) 19:24:30.28ID:JlzCBGqO
if文で文字列を正規表現にマッチしたら抽出、という処理を作りたいのですが、
マッチしたら一つ目の文字列は抽出出来ましたが、二つ目以降マッチしたものが抽出できません
どうコードを書けば良いのでしょうか
0186login:Penguin
垢版 |
2022/01/12(水) 22:51:42.05ID:uKLEW53q
[[ foo-bar =~ (foo)-(bar) ]] && echo ${BASH_REMATCH[2]}
的な?
0にマッチ全体、カッコでグループ化すればn番目の部分マッチが1以降に入る
barが出るはず
0187login:Penguin
垢版 |
2022/01/12(水) 23:04:58.17ID:uKLEW53q
推測だけど、一つ目のマッチだけ見えているんじゃなく、全体のマッチだけ見えてるんじゃないか?
配列変数を添字なしで参照すると0番目の要素が返る、よくある罠

$BASH_REMATCH
= ${BASH_REMATCH[0]}
= foo-bar

違ったらすまん
0188login:Penguin
垢版 |
2022/06/20(月) 21:01:15.77ID:y2PJqfx1
nnn=111;mmm=0;echo $nnn | read mmm;echo $mmm
0
なんで?
0189login:Penguin
垢版 |
2022/06/29(水) 00:20:30.34ID:X2h/MJK6
昔からあるバグです
0190login:Penguin
垢版 |
2024/02/24(土) 13:44:13.05ID:NO8gqPUT
UIDとEUID を食い違いさせる方法って どんなのがありますか?
レスを投稿する


ニューススポーツなんでも実況