よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【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と適当に名付けたファイルに書き出されています。



ファイルの中身を見るコマンド

いま保存したファイルの中身を見るには、エディタで開くか、またはcatheadtailコマンドなどで見ることができます。

  • 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つ使います。

  1. -d 区切り / 何で区切るか
  2. -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

抽出できている行もある。では、どうするか。

スペースを置換する

  1. cat コマンドでファイルを読み込み
  2. 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 を入力して応える。



以上です。