UNIX初心者です。
ksh環境にてシェルスクリプトを作っています。
./(スクリプト)20180401
上記コマンド実行時、引数に指定した年月日をyyyy/mm/dd、yy.mm.ddの形式に変換して変数に格納したいです。
使用するコマンド等お解りの方、ご教授お願い致します。
0895デフォルトの名無しさん2018/04/12(木) 11:16:25.66ID:BGK1pm+1
>>894
最初の引数は $1 で渡されるので ${1:offset:length} のようにすると部分文字列を切り出せる。
例えば ${1:0:4} なら先頭の年の4桁になる。 >>895
ありがとうございます。
要件通り動作しました! 0898デフォルトの名無しさん2018/05/23(水) 19:51:27.67ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
ILEYF
0899デフォルトの名無しさん2018/07/05(木) 01:44:54.61ID:RfoszcD2
9B4
0900デフォルトの名無しさん2018/07/05(木) 03:16:26.29ID:8UhFPcQc
茨城県民死ねよ
0901デフォルトの名無しさん2018/07/05(木) 03:19:12.08ID:Mlujh05Y
おいクソ荒らし
板荒らすのやめろやボケ
0902デフォルトの名無しさん2018/07/05(木) 11:50:50.65ID:IcGtf/nv
IPのひとつはこれかな
364 デフォルトの名無しさん 2018/07/04(水) 21:56:02.05SLIP:ワッチョイ f5fa-2e90 [114.149.223.252](1)ID:gFgZc5FG0(1)
BDR
0903デフォルトの名無しさん2018/07/05(木) 12:20:05.04ID:bmsMRAhD
前科あったのかこのIP
164 デフォルトの名無しさん sage 2018/05/25(金) 13:21:39.62ID:slKDy5Ac(1)
114.149.223.252
0904デフォルトの名無しさん2018/07/05(木) 13:59:50.38ID:LwyvWF7X
>>904
そのページの114.149.223.252の位置情報で表示される地図で
静岡県三島市の株式会社Geolocation Technologyにピンが立ってる 0906デフォルトの名無しさん2018/08/20(月) 16:43:07.23ID:aLr4GPAX
構造のあるテキストの部分だけを加工するにはどうすれば…
$ cat before
* Fruit
apple
banana
orange
banana
* Animal
dog
cat
penguin
$ cat expect
* Fruit
apple
banana
orange
* Animal
cat
dog
penguin
sed の write file をプロセス置換と組み合わせればいけるかと思ったがそんなことはなかった
$ cat before | sed -n -e '/^*/,/^$/{/^*/p;/^*/d;}' -e 'w '>(sort -u)
* Fruits
* Animal
apple
banana
cat
dog
orange
penguin
0908デフォルトの名無しさん2018/08/20(月) 17:01:47.21ID:h5lNG6L+
$ cat before
* Fruit
apple
banana
orange
banana
* Animal
dog
cat
banana
penguin
apple
$ cat expect
* Fruit
apple
banana
orange
* Animal
cat
dog
penguin
でもいいのか?
>>908
いえ、そこまで難しいケースはまだ考えてなくて、各項目の内容をそれぞれソートしたいだけです。
ソートはできれば外部コマンド sort -u などに渡して行いたい。加工方法をコマンドとして取り替えられるようにしたいので。
例えば tr '[a-z]' '[A-Z]' に換えて
* Fruits
APPLE
のようにできると嬉しいです。 0910デフォルトの名無しさん2018/08/20(月) 21:54:46.90ID:jUR6uBV4
切り出して別コマンドに渡すんだよね。
Perl で行の区切りを '*' にして塊を読んで内容をパイプで渡すみたいにすれば良いのではないだろうか。
しかしこれをしようとすると1行プログラムではきつい。
そういえばこれプログラミングのお題スレに問題として書いとくのはどうかな。
お題としては丁度良さそうだし多分みんなして色んな言語で作ってくれるよ。
>>910
アドバイスありがとう。
シェルスクリプトはパイプを使って多くのことを圧倒的な短さで出来るし、テキスト処理は最も得意な領域のはず。
しかしこれだけ単純な課題の答えが複雑になってしまうのなら、これは穴なんじゃないか、みんなどうしてるんだろう、と思ったんです。
俺は今月この種のタスクに何度も直面しました。
流れるコンパイルログの一部分だけをハイライトしたかったり、
Makefileのデバッグログのセクションに分かれた情報をファイルや一時変数を介さないで処理したかったり。
egzactのconvなどがシェルスクリプトのデータ生成という穴を埋めたように、この問題が鬼門なら、
解決するコマンドを考えてみたいです。 >>911
> テキスト処理は最も得意な領域のはず。
それは正しいがシェルは構造を持ったデータをパイプに流せないのでこの手の処理は不得意
PowerShell ならもう少し綺麗にかける シェルは、テキスト・文字列で渡す
一方、PowerShell はオブジェクトだから、構造を持てる。
配列・辞書もOK
Ruby などがベスト
考えたんだけど、もっと単純なタブ区切りデータ
hoo banana
bar apple
baz orange
の二項目名だけをソートして戻す、ということさえシェルスクリプトでは苦悶だ。
戻さないなら cut -f2 | sort でラクなのに。
awesome-cut -f2 <>(sort)
のようにできる読み書き可能ファイルを受け取るコマンド awesome-cut と読み書きプロセス置換<>(...)
機能をシェルに加えれば簡単になるかと思ったがダメだ。この方針はスケールしない。
プロセス置換はコマンド行をパーズした時点で名前付きパイプ?になるらしい。
だからネストされたデータを処理するには、フィルタ処理したい分のプロセス置換をあらかじめベタ書きしておかなくちゃならない。
それを避けるためには xargs のように自分でプロセスを起こす、文字列から作るようなコマンドが必要だ。
しかし現行のシェルスクリプトの仕様では、文字列はネストするほどクォーテーションが厳しくなり、使いにくくなる。
解決方法はわからない。シェルスクリプトを諦めるしかないか。
jqコマンドはJSONを扱う。処理の埋め込みも可能。そういうコマンドの中だけで完結させるか。
(お題スレの解答のPerlは美しかった…)
0916デフォルトの名無しさん2018/08/22(水) 22:13:37.65ID:AXf2QKcH
>>915
フィールド指定出来るソートコマンドを使う >>916
サクッと書けそうなのが良いけど、「フィールド指定可能なtrコマンド」みたいに各コマンドに切り出し埋め込み能力が必要になっちゃう 0918デフォルトの名無しさん2018/08/22(水) 23:34:08.76ID:AXf2QKcH
何で急にありもしないコマンドを発明してんの?
>>918
構造のあるテキストデータの一部分だけ外部コマンドで加工して戻したいんですよ。
それに何が必要なのかを考えています。
「タブ区切りデータの第二カラムをソートして戻す」ために
>>916 は、そういう機能を持つ外部コマンドを使え(必要なら作れ)、
という意味のアドバイスだと受け取ったのですが違うんですか? >>920
ほほう… これが Powershell ですか。項目名でソートできるのが強いですね。
ところでお二方に間違って伝わったみたいで… 書き方が不注意でした。
hoo banana
bar apple
baz orange
の第二カラムをソートして戻すとは、
hoo apple
bar banana
baz orange
を得ることです。第一カラムは変わらないことにご注意を。
sort -k 2 などでは行全体を移動してしまいます。
Powershell ではどのようにこれを実現しますか? 0922デフォルトの名無しさん2018/08/23(木) 01:26:09.02ID:lJLY7fZ1
>>921
cutしてpasteすりゃ済むじゃん
中間ファイルは複数出来るけど >>922
ありがとう。できました(全然苦悶じゃなかった)
all=$(cat); paste <(echo "$all" | cut -f1) <(echo "$all" | cut -f2 | sort)
これを応用すれば上の方の縦型の構造もできるかも。
paste の縦バージョンは cat な訳だから… (たびたびスマン)
hcutのようなものは作れるが、でもネストするのにプロセス置換を使っていたら結局
加工プロセスをあらかじめ作らなくちゃならないので >>915 の問題は解決不能のままだわ。 1列目を、f1 ファイルへ抽出する。
2列目を、f2 ファイルへ抽出する
f2 をソートして、f2a ファイルとする
f1, f2a を合体させる
0926デフォルトの名無しさん2019/06/19(水) 04:55:07.98ID:tVNS+22r
-v -vv
こんなオプションで詳細を表示するコマンドがいくつかあります。
# こんなやつ
date -v+1y
rpm -ivh
この v は何を表しているのですか?
grep の -v はたぶん inVert の v。
ググっても説明してある意味が分からないということ?
0931デフォルトの名無しさん2022/01/31(月) 21:18:15.66ID:2XvruXKk
UNIXでのシステム開発の実際が知りたい
今なんの言語を使って開発してるの?
データベースとか何使ってるの?
0932デフォルトの名無しさん2022/01/31(月) 21:18:36.74ID:2XvruXKk
あ、UNIXっていうのはmacOS以外ね
少し前までJavaを使っていたが、今はC++。
Rustに行きかけたんだけど偉い人に駄目と言われてしまった。
0934デフォルトの名無しさん2022/02/01(火) 13:10:18.35ID:V7jk2Rfu
へー、Rustとか新しいの使えるんだ
UNIXってなんかバラバラで、みんな一体何をどう使って開発しているのか
全然想像つかないんだよね
Linuxみたいにapt-getでrust入れてーとかして使うの?
この頃は Linux ばっかり使っている
UNIX がインストールされているマシンが身近にない
0936デフォルトの名無しさん2023/08/24(木) 18:51:08.86ID:CY1BVKcv
たとえば古い passwd ファイルの形式とかで使われていた
root:x:0:0:root:/root:/bin/bash
user01:x:500:500::/home/user01:/bin/bash
のような「:」区切りのテキストファイルのデータベースを扱いたいとき
C標準のライブラリは何ですか?
Rust用のcrateで言うと何ですか?
Ruby なら、CSV モジュールを使う
require 'csv'
options = { col_sep: ":" } # 列区切り文字
CSV.foreach( "input.csv", options ) do |row| # 1行ずつ処理する
p row
end
出力
["root", "x", "0", "0", "root", "/root", "/bin/bash"]
["user01", "x", "500", "500", nil, "/home/user01", "/bin/bash"]
>>831
Rust
区切るだけならstr.split(':')かstr.splitn(7, ':')が各項目のstrを次々と返してくれる
各項目毎に型(文字列や整数やOptionなど)フィールドを持つ構造体に入れるなら一般的にserde crateが万能
そのケースならcsv crateで':'をデリミタ指定すると容易 0939デフォルトの名無しさん2023/08/25(金) 09:30:30.62ID:5+gJach+
0941デフォルトの名無しさん2023/08/25(金) 10:29:22.44ID:5+gJach+
ああ has_headers() が読み飛ばしてただけか
>>937
を修正。
2, 3列目を整数に変換する
require 'csv'
proc = Proc.new do |field, field_info|
case field_info.index
when 2, 3 then field.to_i
else
field # 処理なし
end
end
options = { col_sep: ":", :converters => proc } # 列区切り文字
CSV.foreach( "input.csv", options ) do |row| # 1行ずつ処理する
p row
end
出力
["root", "x", 0, 0, "root", "/root", "/bin/bash"]
["user01", "x", 500, 500, nil, "/home/user01", "/bin/bash"] C言語とRustについて聞かれているのに
一生懸命Rubyで答えてどうするの?
ちょっと心配した方が良いレベルやぞ
Rustでは文字列から他の型(数値など)への変換やその逆を自動でやってくれる(serdeがある)
以下のように(好きな型名とフィールド名で)構造体を定義するだけで動く
#[derive(Debug, serde::Deserialize)]
struct Passwd {
name: String,
passwd: String,
uid: u32,
gid: u32,
gecos: String,
dir: String,
shell: String,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
// CSVリーダーをヘッダ無しで区切り文字コロンでPASSWD_PATHファイルから読み込みで作成
let mut reader = csv::ReaderBuilder::new()
.has_headers(false)
.delimiter(b':')
.from_reader(std::fs::File::open(PASSWD_PATH)?);
// 各行を構造体Passwdへ読み込む (様々なエラーを捕捉できるようResult型が返る)
for result in reader.deserialize::<Passwd>() {
let passwd = result?;
println!("{passwd:?}");
}
Ok(())
}