Linuxのテキスト処理

2024-01-14 (日) 09:37:35

Linuxのテキスト処理

テキストフィルタ(テキストデータを読込み処理結果を出力する機能)

cat

cat <file-name>
cat -n <file-name> ※左端に行番号を付加して表示
cat <file1> <file2> > <file3> ※file1とfile2を結合してfile3を作成

nl

nl <file-name> ※左端に行番号を付加して表示
nl -bt <file-name> ※本文への行番号の付加(空白以外の行に付加する)
nl -ba <file-name> ※本文への行番号の付加(すべての行に付加する)
nl -bn <file-name> ※本文への行番号の付加(付加しない)

nl -ha <file-name> ※ヘッダへの行番号の付加(すべての行に付加する)
nl -fa <file-name> ※フッタへの行番号の付加(すべての行に付加する)

od

  • 8進数で表示
    od <file-name>
    od -to <file-name>
  • 16進数で表示
    od -x <file-name> ※2バイト単位
    od -tx <file-name> ※4バイト単位
    od -tx1 <file-name> ※1バイト単位
    od -tx2 <file-name> ※2バイト単位
    od -tx4 <file-name> ※4バイト単位
  • ASCII文字で表示
    od -c <file-name>
    od -tc <file-name>
  • 並べて表示
    od -tx1 -a <file-name> ※16進数とASCII文字を並べて表示

head

  • 先頭行の表示
    head <file-name> ※先頭10行を表示
    head -10 <file-name> ※先頭10行を表示(非推奨の書式)
    head -n10 <file-name> ※先頭10行を表示
    head -c10 <file-name> ※先頭10バイトを表示

tail

  • 末尾行の表示
    tail -10 <file-name> ※末尾10行を表示
    tail -n10 <file-name> ※末尾10行を表示
    tail -c10 <file-name> ※末尾10バイトを表示
    tail -f <file-name> ※末尾の行をリアルタイムで表示し続ける(追記を追跡して表示)

tailf

  • ※tail -f と同じ

cut

  • 固定長向け
    cut -c5 <file-name> ※5文字目を取得
    cut -c3-5 <file-name> ※3~5文字目を取得
  • 可変長向け(CSVなど)
    cut -d, -f1 ※カンマ区切りの1カラム目を取得
    cut -d" " -f1 ※スペース区切りの1カラム目を取得(スペース1文字区切り)
    cut -d"\t" -f1 ※タブ区切りの1カラム目を取得

paste

  • 列方向でファイルを結合
    paste <file1> <file2> ※タブ区切りで結合
    paste -d, <file1> <file2> ※カンマ区切りで結合
    paste -d"," <file1> <file2> ※カンマ区切りで結合
    paste -d"\t" <file1> <file2> ※タブ区切りで結合

tr

  • 標準入力した文字列を変換・削除する
  • 書式
    tr <オプション> <文字列>
    • オプションに指定できるクラス
      [:alpha:]
      [:lower:]
      [:upper:]
      [:digit:]
      [:alnum:]
      [:space:]
  • 使い方例
    • パイプを使う
      cat <file-name> | tr 'a-z' 'A-X'
    • リダイレクトを使う
      tr 'a' '0' < <file-name>
      tr 'abc' '012' < <file-name>
      tr 'a-z' 'A-X' < <file-name>
      tr [:lower:] [:upper:] < <file-name>
  • 変換
    tr 'a-z' 'A-X' ※英字の小文字を大文字に変換
    tr [:lower:] [:upper:] ※英字の小文字を大文字に変換
    
    echo $PATH | tr ':' '\n'
  • 削除
    tr -d '0-9' ※数字を削除
    tr -dc '0-9' ※数字以外を削除
    
    tr -d [:digit:] ※数字を削除
    tr -d , ※カンマを削除
    tr -d ',' ※カンマを削除
    tr -d '\n' ※改行コード(ラインフィード)を削除
    tr -d '\r' ※改行コード(キャリッジリターン)を削除(CRLFをLFに変更するのに便利)
  • 1つにまとめる
    tr -s [:space:] ※複数の連続したスペースを1つにする

sort

  • 並び替え
    sort -b <file-name> ※行頭のスペースを無視する
    sort -f <file-name> ※英字の大文字/小文字の区別をしない
    sort -r <file-name> ※降順に並び替える
    sort -n <file-name> ※数字を数値として扱う

split

split -10 <input-file> <output-file> ※10行ごとに分割したファイルを作成する(末尾がaa,ab,ac,..で作成)

uniq

  • 重複する行に対する処理
    uniq <file-name> ※連続で重複している行を1つにまとめる
    uniq -d <file-name> ※連続で重複している行のみ出力する
    uniq -u <file-name> ※連続で重複していない行のみ出力する(重複している行を出力しない)
    
    sort <file-name> | uniq ※昇順に並び替えてから重複行を1つにまとめる

wc

wc -l <file-name> ※行数を表示
wc -c <file-name> ※文字数を表示
wc -w <file-name> ※単語数を表示

ls | wc -l ※ファイルとディレクトリの数を表示

テキスト検索

fgrep

  • fgrep <patterns> <file-name> 正規表現を使わない文字列検索

strings

  • バイナリファイルなどに含まれるASCII文字を検索する
    strings -a <file-name> ※ファイル全体をスキャン

テキスト検索(正規表現

grep

  • grep <patterns> <file-name> ※ファイルの文字列検索
    grep -c
    grep -i ※英字の大文字/小文字を区別しない
    grep -n ※検索結果に行番号を表示
    grep -v ※マッチしない行を表示
    grep -v '^#' ※コメント行を除く
    grep -G ※基本正規表現
    grep -E ※拡張正規表現
    
    grep $'\t' ※タブ文字
    grep '\s' ※スペース
  • grep -e <patterns> <file-name> ※検索パターンの指定
    grep -v -e "^#" -e "^$" ※コメント行と空行を除く
  • grep -f <pattern-file> <file-name> ※検索パターンをファイルから読み込む

egrep

  • 拡張正規表現を使った文字列検索
  • egrep <keyword> <file-name>

テキスト編集(検索して削除・置換)

sed

  • 実行パターン
    • sed <command> ※指定したコマンドを実行
    • sed <command> ※指定したコマンドを実行
    • sed -e <command> ※指定したコマンドを実行
    • sed -e <command1> -e <command2> ※指定した複数のコマンドを実行
    • sed -f <script-file> ※コマンドを記述したスクリプトファイルを読み込んで実行
    • sed -i <command> <replace-file> ※指定したコマンドを処理した結果でファイルを更新
  • コマンド部の書式
    • 行削除(d) ※位置を指定
      sed -e ‘[削除開始行],[削除終了行]d’
    • 置換(s) ※文字列(またはパターン)
      sed -e 's/[置換前の文字列]/[置換後の文字列]/g'
    • 削除(s) ※文字列(またはパターン)
      sed -e 's/[削除対象の文字列]//g'
    • 置換(y) ※文字(指定した同じ位置の文字に置換)
      sed -e 'y/[置換前の文字の並び]/[置換前の文字の並び]/g'
  • 実行例
    • 行削除(d)
      sed '1,2d' input.txt ※1~2行目を削除
      sed '2,$d' input.txt ※2行目~最終行を削除(1行目以外を削除)
    • 置換(s) ※文字列、パターン
      sed s/test/sample/ input.txt ※"test"を"sample"に置換(1行に複数ある場合は左の1件のみ)
      sed s/test/sample/g input.txt ※"test"を"sample"に置換(1行に複数ある場合は全て)
      sed '1,100s/^/#/' input.txt ※1~100行目の先頭に"#"を付加する
    • 置換(y) ※文字単位
      sed y/ABC/abc/ input.txt ※置換文字列の同じ位置の文字に置換(A→a,B→b,C→c)

awk

awk '{print $1}' ※1カラム目を抽出