1. これは何?

文字列を弄るLinuxコマンドのまとめ。
ってかまとめきれてない。
製作途中。




2. ファイル操作

2.1. cat

・ファイルの連結
 cat file1 file2 > file3
・複数行のファイル書き込み cat > filename << EOF
 dfsaf
 dfsaf
 EOF

2.2. split

・行数指定でファイルの分割
 split -l 100 file

2.3. diff

2.3.1. 使用例

・2つのファイルの違いを表示する
 diff file1 file2

2.3.2. 表記方法

■標準の結果表記方法
・「数字 a/d/c 数字」というフォーマット
・アルファベットの意味
 a=added=追加
 d=deleted=削除
 c=changed=変更
・数字の意味=ファイルの行数

・以下、diff file1 file2とした場合の具体例
2d1 <world と表示された場合
2d1<world
file1の2行目が削除された。file2での対応箇所は1行目と2行目の間。削除された文字
1c1 < hello --- > hello2 と表示された場合
1c1< hello --- > hello2
file1の1行目が変更された。file2での対応箇所は1行目。上から下に変更
1a2,3 > 1 > 2 と表示された場合
1a2,3> 1 > 2
file1の1行目の後に行が追加された。file2でいう2行目と3行目が該当箇所。追加された内容
■unified形式(-uオプション) ・@@ -1,9 +1,10 @@  →元ファイルの1〜9行目と、変更後ファイルの1〜10行目についての記載 ・-から始まる行  →元ファイルから削除 ・スペースから始まる行  →変更なし ・+から始まる行  →変更後ファイルでは追加されている ■context形式(-cオプション) ・*** 1,5 ****  →元ファイルの1〜5行目の、変更箇所(変更後ファイルとの比較) ・--- 1,6 ----  →変更後ファイルの1〜6行目の、変更箇所(元ファイルとの比較) ・!から始まる行は変更された行 ・+から始まる行は追加された行 ・-から始まる行は削除された行 ■side-by-side形式(-yオプション) ・2ファイルが横並びに表示されて見やすい ・違う行は|が、片方だけにある行は不等号が付く

2.4. grep

・grep pattern file
   -c:マッチした行
   -n:行番号付ける
   -l:マッチしたファイル名だけ
  cf.patternには'正規表現'も可能
  -F:正規表現を無効にする。fgrepと同義




3. 文字列操作

3.1. sed

・sed -e 's/置換前/置換後/g'(連続で、-e 's/置換前/置換後/g'、とできる)
・特定文字(カッコ)に挟まれた部分を取り出す
 echo 'abc ' | sed 's/.*<\(.*\)>/\1/'
・・s///gのgは複数回適用

3.2. tr

・特定の文字削除
 echo hello | tr -d h
・1文字置換
 echo "いっぱい" | tr い お


3.3. find



3.4. awkコマンド

3.4.1. はじめに

・一種のプログラミング言語。データを「行ごと」に読み込み、処理する。
・使用方法
 ・cat 処理対象ファイル | awk 'awkコード'
 ・awk 'awkのコード' 処理対象ファイル
 ・awk -f awkのコードをまとめたファイル 処理対象ファイル

3.4.2. 総論

・パターン {アクション}のフォーマット
 →パターンに合致した場合、処理するファイルの各行にアクションを適用する
・awkのコードは全体で以下のような構成をとる
 BEGIN{アクション}  #省略可
 パターン{アクション}
 END{アクション}    #省略可
・awkはデータの各行を読み込む際、スペース又はタブを区切り文字として
 データを分割し、$1,$2・・・という変数に代入する
 →個々の区切りをフィールドと言う
 →区切り文字を変えるには、BEGIN{FS="別の区切り文字"}という風にする
・変数も使える
 awk 'BEGIN{test=4545; print test}' /dev/null
 cf.ファイルを開かないので、便宜的に/dev/nullとしている
・ファイルに書き込むこともできる
 awk 'BEGIN{test=4545; print test > "awktest2"}' /dev/null

3.4.3. 文法

・if(条件式){}/if(条件式)一行の場合;/else/else ifも
・do while/while/continue break
・for(;;)/for(i in 配列)
・next:処理中の行を次の行にする
など

3.4.4. 組み込み変数

・$0 処理中の行全体(レコード)
・$1 $2 $3... 特定文字(defaultでスペースとタブ)で分割された各要素(フィールド)
・FS フィールドセパレータ
 e.g. BEGIN{FS=","}として,を区切り文字にすると、csvデータの読み込みができる
・ARGC ARGV コマンドライン引数の数、その内容
・NF フィールドの数
など

3.4.5. 正規表現

 . 任意の一文字/* 直前の0個以上の繰り返し/+ 直前の1個以上の繰り返し
   →組み合わせて.*は任意の1種類の文字の0個以上の繰り返し
   →組み合わせて+*

 ^ 行頭/$ 行末/^$ 空行

 [] []中のどれか1文字
   →-で範囲指定可能
   →[ぁ-ん] 平仮名すべて。

 | 正規表現のor  e.g. aaa|bbb

 () グループ化  e.g. (aaa|bbb|ccc)

 \ 次にくる文字それ自体
   →\.などエスケープに使う

3.4.6. 関数

index length match subとgsub(置換)
など

3.4.7. 個人的awk雑感

awkは、pythonで言うと
 for i in open(filename,"r").readlines():
	d = i.split(" ")
としたような感じか。別に置き換えられないわけではない。
むしろ、あまり長いコードを書くならば、pythonなどの別の言語のが見やすくて良い。

だから、awkに関してはあんまり複雑なことやんない方がいーかも。
ただ、1行で収まる程度のコードならば、awkの方が見やすくて簡便。
そこにawkの利点があると思う。




3.5. bash

3.5.1. ファイルから1行ずつ読み込み

#!/bin/sh
while read LINE; do
    echo $LINE
done < “ファイル名”