最初のテキストを既に知っていますが、最初のテキストと2番目のテキストを取得して2番目のテキストを作成する方法の最小限のガイドラインを提供するアルゴリズムを知っている人はいますか?
たとえば、「uptime」の出力は次のようになります。
16:18 up 1 day, 12:15, 4 users, load averages: 2.23 2.66 2.53
1分後:
16:19 up 1 day, 12:16, 4 users, load averages: 2.23 2.66 2.53
この場合の唯一の変更は時間です。
すべての形式の出力が許可されます。次の例は、最初の行から2番目の行を作成するために使用される情報を構造化する方法に関する私のアイデアの1つです。
最初の稼働時間呼び出しを2番目の呼び出しと比較したときの出力例:
4:1:9
21:1:6
4:1:9(4番目の位置に「9」を追加 - 1文字を削除)
21:1:6 (位置 21 - 削除する文字 1 個に「6」を追加)
おそらくgitでいくつかのコマンドを使用するかもしれませんが、シェルスクリプトを実行できるすべてのシステムで実行できる最も単純な、可能な依存関係なしに可能な解決策を探しています。
やりたいことをよりよく理解するために更新してください。
この diff ソリューションはバイトを節約するために必要です。 Trafikito.comエージェントはサーバー上で実行されており、いくつかのコマンド(例:uptime
free -m
など)の出力をAPIエンドポイントに送信します。これは1分に1回発生し、サーバーへのいくつかのアウトバウンドトラフィックを生成します。違いだけを送信してネットワークのスペースを減らしたいです。そして、ほとんどの場合、出力全体で少数の数だけが変更されます。
diff
- このツールは1行ずつ比較するため、1行だけ出力するuptime
コマンドには適していません。
cmp
- ツールはバイト単位で比較しますが、コマンドの出力が大きい。対応するバイトが文字列の先頭に挿入されると、将来のすべてのバイトの違いが表示されます。残りのコンテンツをすべて移動し、x の位置に新しいコンテンツを挿入する様子だけを表示することもできます。
答え1
次の点を考慮しましたかcmp
?
cmp -lb file[12]
5 70 8 71 9
22 65 5 66 6
答え2
$ diff -e uptime1 uptime2
1c
16:19 up 1 day, 12:16, 4 users, load averages: 2.23 2.66 2.53
.
diff -e
ed
最初のファイルを2番目のファイルに変換するのに適したスクリプトを出力します。行全体のみを追加、削除、または変更します。
スクリプトを生成して適用します。
$ diff -e uptime1 uptime2 >diff.ed
後:
$ { cat diff.ed; echo ',p'; } | ed -s uptime1 >newfile
これにより、 の内容がuptime1
の内容に変換されますuptime2
。結果ファイルを標準出力に書き込んで保存しますecho ',p'
。ed
newfile
または、このユーティリティを使用して、diff
4つの出力タイプ(一般、均一、コンテキスト、およびed)のいずれかを適用できますpatch
。
$ patch uptime1 <diff.ed
Hmm... Looks like an ed script to me...
Patching file uptime1 using Plan A...
Hmm... Ignoring the trailing garbage.
done
diff
patch
システムのマニュアルを参照してください。