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
と表示された場合 | |||
---|---|---|---|
2 | d | 1 | <world |
file1の2行目が | 削除された。 | file2での対応箇所は1行目と2行目の間。 | 削除された文字 |
1c1
< hello
---
> hello2
と表示された場合 | |||
---|---|---|---|
1 | c | 1 | < hello --- > hello2 |
file1の1行目が | 変更された。 | file2での対応箇所は1行目。 | 上から下に変更 |
1a2,3
> 1
> 2
と表示された場合 | |||
---|---|---|---|
1 | a | 2,3 | > 1 > 2 |
file1の1行目の後に | 行が追加された。 | file2でいう2行目と3行目が該当箇所。 | 追加された内容 |
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 < “ファイル名”