【Linuxコマンド cut】ファイルから区切りを指定してフィールドを抜き出す方法(pip install のメモ)
Linuxコマンドのcutの使い方メモ
Pythonのpipコマンドでライブラリのバージョンアップをする際、ライブラリ一覧のファイル操作をLinuxコマンドで行ったときのメモです。
cut
コマンド以外も使っています。
pip list -o アップデート可能なリスト表示
pip list
コマンドはインストール済みのPythonライブラリ一覧を表示しますが、pip list -o
という風に オプション-o
(ハイフン オー。小文字) をつけると、アップデート可能なリストが表示されます。
@~ $ pip list -o ↩️(← エンターキー) Package Version Latest Type ------------ -------- ---------- ----- fonttools 4.29.1 4.30.0 wheel itsdangerous 2.1.0 2.1.1 wheel yt-dlp 2022.2.4 2022.3.8.2 wheel
3つのライブラリがアップデート可能なようです。
ライブラリのバージョンアップをするには、pip install -U ライブラリ名
とコマンドを打てばできます。複数ある時はスペースで区切ってライブラリ名を羅列すればよい。
しかし、たくさんある場合は入力が面倒です。ファイルに書き出して一括バージョンアップ出来ないか?
順をおって見ていきます。
先ほど pip list -o
で表示されたものは、
スペース区切りの一番最初のフィールドがライブラリ名です。まずはそれだけを抽出したい。
ファイルに書き出せば、pip install -U -r requirement.txt
のようにして一括アップデート出来ます。
pip list -o をファイルに書き出す
pip list -o
でアップデート可能なリストをファイルに書き出します。
コマンド実行で通常は標準出力(モニターに表示)されるところ、コマンド > ファイル名
と後ろに付けることにより、出力先をファイルに出来ます(ファイルに書き出される)。これをリダイレクトやリダイレクションと言う。超簡単便利です。
@~ $ pip list -o > updatable.txt ↩️ @~ $
何も表示されませんが、updatable.txt
と適当に名付けたファイルに書き出されています。
ファイルの中身を見るコマンド
いま保存したファイルの中身を見るには、エディタで開くか、またはcat
、head
、tail
コマンドなどで見ることができます。
- cat コマンド
@~ $ cat updatable.txt ↩️ Package Version Latest Type ------------ -------- ---------- ----- fonttools 4.29.1 4.30.0 wheel itsdangerous 2.1.0 2.1.1 wheel yt-dlp 2022.2.4 2022.3.8.2 wheel
- head コマンド 先頭n行を表示
先頭2行を表示させてみる。
@~ $ head -n 2 updatable.txt ↩️ Package Version Latest Type ------------ -------- ---------- ----- @~ $
nオプションを省略すると先頭10行を表示。
- tail 最終n行を表示
後ろ2行を表示させてみる。
@~ $ tail -n 2 updatable.txt ↩️ itsdangerous 2.1.0 2.1.1 wheel yt-dlp 2022.2.4 2022.3.8.2 wheel @~ $
cut コマンドで指定フィールドを抽出
いよいよ本題。
スペースで区切られた一番最初フィールドだけを抽出し、ライブラリ名の一覧を作ります。
オプションを2つ使います。
- -d 区切り / 何で区切るか
- -f 整数値 / 何番目のフィールドを抽出するか
- スペース区切り、1番目のフィールド を抽出
@~ $ cut -d " " -f 1 updatable.txt ↩️ Package ------------ fonttools itsdangerous yt-dlp
オプション -d " "
でスペース1個区切り。""(ダブルクオート)
の中にスペースを入力しわすれないこと。
オプション -f 1
で1番目のフィールドを抽出。
じゃあ、-f 2
にすれば現在のバージョンを、-f 3
なら最新バージョンが抽出できるかと言うと、この場合は出来ない。
理由は、スペースの個数が行ごとにバラバラになっているから。試しにやってみましょう。
@~ $ cut -d " " -f 2 updatable.txt ↩️ -------- 2.1.0
抽出できている行もある。では、どうするか。
スペースを置換する
- cat コマンドでファイルを読み込み
- sed コマンドで複数スペースを置換
これらを |
(ぱいぷ) でつなぐ。
@~ $ cat updatable.txt | sed 's/ */ /g' ↩️ Package Version Latest Type ------------ -------- ---------- ----- fonttools 4.29.1 4.30.0 wheel itsdangerous 2.1.0 2.1.1 wheel yt-dlp 2022.2.4 2022.3.8.2 wheel
スペースが複数入っていたものを、全てスペース1つに置換した。
これで、フィールドを指定して抽出できる。
- 現在のバージョンのフィールド(2つ目)を抽出
@~ $ cat updatable.txt | sed 's/ */ /g' | cut -d " " -f 2 ↩️ Version -------- 4.29.1 2.1.0 2022.2.4
- 最新バージョンのフィールド(3つ目)を抽出
@~ $ cat updatable.txt | sed 's/ */ /g' | cut -d " " -f 3 ↩️ Latest ---------- 4.30.0 2.1.1 2022.3.8.2
今回はライブラリ名だけ抽出できれば良いので、上記は蛇足だった。
- ライブラリ名だけ抽出する
@~ $ tail -n 3 updatable.txt | cut -d " " -f 1 ↩️ fonttools itsdangerous yt-dlp
上記をファイルに書き出せば pip install -U -r ファイル名
で、記載されたライブラリの一括バージョンアップできる。
- ファイルに書き出す(リダイレクション)
@~ $ tail -n 3 updatable.txt | cut -d " " -f 1 >requirement.txt ↩️ @~ $
pip list -o
を書き出したファイルの下3行を読み、それをスペースで区切って1番目のフィールドだけを抽出し、ファイル名requirement.txt
に書き出した。
ファイル指定してpipコマンドでライブラリのバージョンアップ
通常は pip install -U ライブラリ名
でライブラリのバージョンアップができますが、pip install -U -r ファイル名
とすれば、ファイルに記載されたライブラリの一覧を一括でバージョンアップできます。
@~ $ pip install -U -r requirement.txt ↩️ ライブラリのバージョンアップが始まる~ Successfully installed ナントカカントカ @~ $
不要になったファイルを削除
@~ $ ls ↩️ requirement.txt updatable.txt
作った上の2つのファイルは不要なので削除します。
@~ $ rm -i requirement.txt updatable.txt ↩️ rm: remove regular file 'requirement.txt'? y rm: remove regular file 'updatable.txt'? y @~ $
rm ファイル名1 ファイル名2
コマンドでファイル削除。
オプション-i
をつけると、削除指定したファイルを「削除して良いか?」と確認してくれる。y/n を入力して応える。
以上です。