1. 16の基本コマンド
1. ファイルの所有者変更:(sample.txtの所有者をdb_userに変更し、ls -lで確認)
chown db_user:db_group sample.txt
2. 現在のユーザーに実行権限を追加し、ls -lで確認:
chmod u+x sample.txt
3. ファイルの差分を確認:
diff file_a.txt file_b.txt
4. ファイルの位置を検索:
find ./ -name sample.txt
5. プロセスを終了させる:
kill -9 12345
6. sample_userユーザーの全プロセスを終了させる:
ps -ef | awk '$1=="sample_user"{print $2}' | xargs kill -9
7. 現在の時刻を表示:
date
8. 現在のユーザーを確認:
id
9. ホスト情報を表示:
uname -a
10. rootユーザーでsample_userのパスワードを変更:
passwd sample_user
11. ディスク使用量を確認:
df -h
12. 現在のディレクトリを表示
pwd
13. 標準出力(printと同様):
echo 'Hello World'
14. ファイルの最初の10行を表示
head -10 sample.txt
15. ファイルの最後の10行を表示
tail -10 sample.txt
16.viエディタの基本操作
ESCキーを押した後:
x:1文字削除
dd: 1行削除
ボトムラインモード:
行番号の表示: set nu
検索:/検索文字
2. ファイル権限に関するコマンド
1. 権限の文字表記:
3つのカテゴリ:所有者、グループ、その他
r:読み取り---4
w:書き込み---2
x:実行---1
2. 現在のユーザーに実行権限を追加し、ls -lで確認:
chmod u+x sample.txt
3. ファイルの所有者変更:(sample.txtの所有者をdb_userに変更し、ls -lで確認)
chown db_user:db_group sample.txt
4. 例:-rw-r--r-- 1 root root 68 Mar 27 00:40 script.sh
所有者:root 権限:rw
グループ:root 権限:r
しかし、所有者rootはsh script.shでこのファイルを実行できます。なぜなら、読み取り権限があるからです。
./script.shで直接実行することはできません。
実行するには、権限を付与する必要があります:chmod +x script.sh
5. スクリプトの実行方法:(./とshが推奨)
読み取り権限(r)がある場合:
sh script.sh
bash script.sh
source script.sh
実行権限(x)がある場合:
sh script.sh
bash script.sh
source script.sh
./script.sh
6. .shスクリプトの仕組み:
ファイルの内容を読み取り、その中のコマンドを実行するだけなので、読み取り権限さえあれば実行できます。
3. シェルの演算子
1. 演算子>
ファイルの内容を削除し、新しい内容を追加します。catとよく組み合わせて使用します。
cat > sample.txt
(改行して内容を入力)
2. 演算子>>
ファイルの内容を削除せずに、文字列を追加します。catとよく組み合わせて使用します。
cat >> sample.txt
(改行して内容を入力)
3. 演算子;
複数のコマンドを順番に実行します。
cat sample.txt ; ls
4. 演算子|
パイプライン:| はパイプを意味し、前のコマンドの出力を次のコマンドの入力(引数)として渡します。
cat sample.txt | grep 'hello'
5. 演算子&&
前のコマンドが成功した場合にのみ、次のコマンドを実行します。
cat sample.txt && ls
6. 演算子||
前のコマンドが失敗した場合にのみ、次のコマンドを実行します。
7. 演算子""
変数の値を出力します。
echo "最初の変数は:$var"
8. 演算子''
すべてを文字列として出力します。
echo '最初の変数は:$var'
9. 演算子``
バッククォート内のコマンドを評価します。
a='date' # 文字列として代入 echo $a # 結果は'date'
a=`date` # コマンドとして実行 echo $a # 結果は現在時刻
10. 無限穴(/dev/null)
2>/dev/null エラーメッセージを無限穴に送り、コンソールに表示されません。
>/dev/null 正常出力を無限穴に送り、コンソールに表示されません。
cat sample.txt 2>/dev/null
4. 算術演算子
1. 式の結果を出力する3つの方法:
expr 12 + 2
echo $[12 + 2]
echo $((12 + 2))
2. bc計算機を使用する(文字列をbcに渡して処理)
echo "1.2+1.3" | bc # 結果:2.5
echo "scale=2;1.2+1.3" | bc # 結果:2.5
echo "scale=2;(1.2+1.3)/1" | bc # 結果:2.50
5. 条件判断
-e 対象が存在するか: [ -e sample.txt ] || touch sample.txt
-d ディレクトリかどうか: [ -d /var ] && echo '存在'
-f ファイルかどうか
-r 読み取り権限があるか: [ -r sample.txt ] && echo '読み取り権限あり'
-w
-x
整数:
-eq 等しい [ 9 -eq 9 ] && echo '等しい'
-ne 等しくない
-gt 大きい
-lt 小さい
-ge 以上
-le 以下
文字列:
= 等しい [ 'abc' = 'abc' ] && echo '等しい'
!= 等しくない
小数:bc計算機を利用 [ `echo '1.2 > 1.3' | bc` -eq 1 ] && echo '大きい'
一般的な使い方:
[ $? -eq 0 ] 直前のコマンドが成功したかどうかを判断
6. readコマンド
readコマンド:
-p プロンプトを表示
-s 入力内容を隠す
-t タイムアウト時間を設定(時間内に入力がなければreadを終了)
-n 読み取る文字数を制限し、指定数に達すると自動的に実行
7. -e の機能
-e : エスケープシーケンスを有効にする:
echo -e "
"
`echo -e "\033[4;31m Hello: \033[0m"`
8. 大量データ処理:grep, awk, sed, cut
8.1 grep: 行操作
-v : マッチしない行を表示
-n : 行番号と内容を表示
-w : 完全一致
-i : 大文字小文字を区別しない
^ : 行の先頭にマッチ
-E : 正規表現マッチ
123.shファイルから'user'を含む行を抽出
grep 'user' 123.sh
'user'で始まる行をマッチ
grep '^user' 123.sh
'user1'または'user2'または'user3'を含む行をマッチ
grep -E 'user1|user2|user3' 123.sh
8.2 cut: 列操作
-d : 区切り文字を指定(指定しない場合はタブで区切る)
-f : 切り出すフィールドを指定
-c : 文字単位で切り出す
':'を区切り文字として、123.shファイルの第1列と第3列を切り出す
cut -d ':' -f 1,3 123.sh
':'を区切り文字として、123.shファイルの第1列から第3列を切り出す
cut -d ':' -f 1-3 123.sh
':'を区切り文字として、123.shファイルの第2列から最終列を切り出す
cut -d ':' -f 2- 123.sh
123.shファイルの2文字目から9文字目を切り出す
cut -c 2-9 123.sh
例:
システムにログイン可能な一般ユーザー(rootを除く)を抽出する
grep '/bin/bash' /etc/passwd | cut -d ':' -f 1 | grep -v 'root'
cat /etc/passwd | grep 'bin/bash' | cut -d ':' -f1 | grep -v 'root'
8.3 強力なawk:列操作
awk [オプション] '条件{アクション} 条件2{アクション} ..' ファイル名
オプションと条件は省略可能
printf: フォーマット出力、自動改行なし
\t:タブ
: 改行
%ns: 文字列 nは文字数
%ni: 整数 nは桁数
%.nf: 浮動小数点 nは小数点以下の桁数
printf '%s\t%s\t%s\t%s
' 1 2 3 4 5
print: 自動改行あり
例:ディスク使用率を表示
df -h | grep /dev/sda1 | awk '{printf "/dev/sda1の使用率:"} {print $5}'
浮動小数点計算(最後の$0は全行を表す)
echo "scale=2; 0.13 + 0.1" | bc | awk '{printf "%.2f
",$0}'
$0: 全行
$1: 第1列
$2: 第2列
...
条件:
-F: 区切り文字を指定:
cat /etc/passwd | cut -d ':' -f 1
cat /etc/passwd | awk -F":" '{print $1}'
BEGIN: ファイルの全内容を読み込む前に実行。通常、組み込み変数の値を変更するために使用。
FS: BEGINで区切り文字を定義
cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}'
END: 終了時に実行
cat /etc/passwd | awk -F":" '{print $1} END{printf "以上が実行結果
"}'
NR: 行番号
df -h | awk '(NR>=2 && NR<=5) {print $5}'
awk '(NR>=2 && NR<=5) {print $5}' /etc/passwd
行番号を表示:
nl /etc/passwd | awk '(NR>=2 && NR<=5) {print $1}'
8.4 sed:抽出、追加、検索、置換、削除
sed [オプション] [アクション] ファイル名
オプションとアクションは省略可能
-n: マッチした行のみを表示
p: 行単位で検索。通常-nと一緒に使用。
2行目を表示:
df -h | sed -n '2p'
'2'を含む行を表示:
df -h | sed -n '/2/p'
d: 削除(元のファイルは変更されない)
2行目を削除:
df -h | sed '2d'
テキストを新しいファイルに保存
df -h > newdf.txt
sed '2d' newdf.txt
a: 行の下に新しい内容を挿入(元のファイルは変更されない)
sed '2a 123456789' newdf.txt
i: 行の上に新しい内容を挿入(元のファイルは変更されない)
sed '2i 123456789' newdf.txt
c: 置換
2行目を置換:
sed '2c 123456789' newdf.txt
s/str1/str2/g str2でstr1を置換
sed 's/0%/100%/g' newdf.txt
-i: 元のファイルを直接変更(危険な操作、必ずバックアップを取る)
sed -i 's/0%/100%/g' newdf.txt
-e: 複数のアクションを実行可能
検索と置換、表示の2つのアクションを同時に行う例
cat newdf.txt | sed -n -e 's/0%/100%/g' -e '/100%/'
検索方法:
sed -n '/100%/p' newdf.txt
cat -n newdf.txt | sed -n '/100%/p'
以前学んだgrepでの検索:
cat -n newdf.txt | grep 100%
9. ループ処理
9.1 if文
1. if [条件];
then
アクション
fi
2. if [条件];
then
アクション
else
アクション
fi
例:入力ファイルが存在するかどうかを判断
#!/bin/bash
if [ -e $1 ];
then
echo "$1が存在します"
else
echo "$1が存在しません"
fi
3. if [条件];
then
アクション
elif [];
アクション
fi
例:入力された数字が10より大きいかどうかを判断
#!/bin/bash
echo '数字を入力してください:'
read number
if [ $number -eq 10 ];
then
echo "$number は10に等しい"
elif [ $number -gt 10 ];
then
echo "$number は10より大きい"
else
echo "$number は10より小さい"
fi
9.2 forループ
1. 形式:
for 変数名 in 値1 値2 ....
do
アクション
done
例:1から10までを表示
#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
echo $i
sleep 1
done
2. 形式
for 変数名 in `コマンド`
do
アクション
done
例:1から100までを表示
#!/bin/bash
for i in `seq 1 100`
do
echo $i
done
例:baiduに2回pingを送り、通れば終了
#!/bin/bash
for i in $(cat host_list.txt)
do
ping -c 2 $i
echo -e "
"
done
host_list.txtの内容例
www.example.com
www.test.com
3. 形式:
for ((条件))
do
アクション
done
例:1から10までを表示
#!/bin/bash
for ((j=1; j<=10; j++))
do
echo $j
sleep 1
done
9.3 case文:(パターンマッチング)
1. 形式:(;;は処理終了を意味)
case 変数 in
値1 )
アクション
;;
値2 )
アクション
;;
値3 )
アクション
;;
...
esac
例:都市の天気を照会
echo '都市名を入力してください'
read city
case $city in
'Tokyo')
echo "$cityの気温は23度、暑いです"
;;
'Osaka')
echo "$cityの気温は24度、暑いです"
;;
'Fukuoka')
echo "$cityの気温は25度、暑いです"
;;
*)
echo "入力が間違っています"
;;
esac
9.4 whileループ
1. 形式:
while [ 条件式 ]
do
アクション
done
例:0からnまでの和を計算
#!/bin/bash
j=0
sum=0
while [ $j -le $1 ]
do
sum=$((sum+j))
j=$((j+1))
done
echo '合計は:'$sum