bash学习记录
windows:cygwin
文件处理命令
一、创建文件:vi / vim
命令 vi test.txt
1.编辑模式:输入i (在光标前面添加字符) 输入a (在光标后面添加字符)
2.退出编辑模式:按下esc
3.保存文件:输入w
4.退出文件:输入q 强制退出(不保存):输入q!
二、查找文件 find
1.在主目录查找文件
find ~ -name "*.log"
其中,
~ 表示主目录
-name 表示指定文件名,后面接正则表达式
"*.log" 后缀名为log的文件
2.只查找两层目录
find ~ -maxdepth 2
3.列出当前目录下两级目录中的所有文件
find ~ -maxdepth 2
4.列出当前目录下两层目录名
find ~ -maxdepth 2 -type d
返回
/home/cy #当前目录
/home/cy/.pki #下一级目录
/home/cy/.pki/nssdb #下一级目录的再下一级目录
echo ~ 返回/home/cy
三、路径简写
echo ~
当前用户的主目录ls /
根目录
四、 查看文件内容cat
cat test.txt
返回test.txt所有文件内容
五、翻页查看文件内容more
more test.txt
每次展示一页内容,空格翻页
六、翻页查看文件内容less(更多方便操作)
less test.txt
每次展示一页,可翻页可上下滚动可左右滚动,向上翻页(使用b)
七、文件内搜索
less text.txt
/xxx #文件内搜索xxx 按n可以继续往后搜索,shift+n 往前搜索
八、ls
1.ls -l 返回结果分析(文件权限)
ls -l
返回-rwxrwxr-x 1 root root 26 Dec 8 17:08 1.sh
其中:
第1位"-" 表示文件的类型,软链为l,-为文件,d为目录
rwxrwxr-x ,前3位rwx:当前用户权限 中间3位rwx:root组的用户权限 后3位r-x:非同组的用户other
root 当前用户
root 当前组
26 文件大小
Dec 8 17:08 文件最后修改时间
1.sh 文件名
2.打印指定目录权限
ls -ld /tmp/
打印/tmp/这个目录的权限
九、软链ln
ln -s 1.txt 3.txt``` # 1.txt为目标文件
# 创建两个文件之间的关联,使得3.txt指向1.txt,3.txt为新创建的文件
十、touch 创建空文件
十一、mkdir 创建目录
mkdir a/b/c -p
创建多层目录
十二、pwd 显示当前目录
十三、 rm 删除文件
- 删除目录
rm -r
- 增加删除确认
rm -ri
十四、cp 复制
cp ./1.txt ./a
复制文件到a文件夹cp -a ./a ./b/
-a参数 复制文件夹
十五、mv 移动文件/重命名
- 重命名
mv 1.txt 2.txt
- 移动文件
mv 2.txt ./a/
查看当前用户名
whoami
chmod
```chmod o+w 1.txt``` 给other用户组 写权限
chgrp 换掉权限位
chgrp groupname filename
获取命令的帮助文档 man
man ls
进程
1. top
获取特定进程的数据,不断刷新数值
2. ps
获取特定进程的数据快照,数值不刷新
3. ps aux
获取所有进程
4. ps -ef
获得所有进程列表,并提供更多可用数据
5. fg
进程切到前台
6. bg
进程切到后台
7. crtl z 挂起进程
netstat -tlnp 返回当前机器正在对外开放的端口
grep 基于正则表达式查找满⾜条件的⾏
1.grep pattern file
```
echo '1234a56' | grep a # 在输入字符中查找
grep a test.txt # 在文件中查找
```
2.grep -i pattern file 忽略⼤⼩写
3.grep -v pattern file 不显⽰匹配的⾏
```
grep -v a test.txt # 返回 没有匹配到pattern 的行
```
4.grep -o pattern file 把每个匹配的内容⽤独⽴的⾏显⽰
```
grep -o a 1.txt # 返回匹配的内容,分行显示,但是不返回匹配内容所在的行
```
5.grep -E pattern file 使⽤扩展正则表达式
6.grep -A -B -C pattern file 打印命中数据的上下⽂
-C 返回匹配内容上下文 `grep -C2 a 1.txt` 返回匹配内容所在行以及此行的上下2行
-B 返回匹配内容上文 `grep -B2 a 1.txt` 返回匹配内容所在行以及此行的前2行
-A 返回匹配内容下文 `grep -A2 a 1.txt` 返回匹配内容所在行以及此行的后2行
7.grep pattern -r dir/ 递归搜索 在目录下搜索
```
grep a -r . # 返回当前目录下,所有包含pattern的文件内容
```
awk 根据定位到的数据⾏处理其中的分段
awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
按行对数据进行处理
- 字段变量
-F 指定字段分隔符
BEGIN{FS="_"}也可以指定分隔符
$0 代表当前记录,整行
$1 代表第一个字段
$N 代表第N个字段
$NF 代表最后一个字段
NR 行数
echo '11 22 cc dd 00' |awk '{print $2}' # 22 显示第2列
echo '11 22 cc df 00' | awk '$2 == 22 {print $2}' # 22 如果第2列==22,则打印第2列
echo '11 22 cc df 00' | awk '$2 == 12 {print $2}' # 无返回,因为第2列!=12
echo '11 22 cc df 00' | awk 'BEGIN{print "z0","z1"}$2 == 12 {print $2}' # z0 z1 在开始之前打印z0 z1
echo '11 22 cc df 00' | awk 'BEGIN{print "z0","z1"}$2 == 22 {print $2} END{print "end!"}' #
#返回如下
#z0 z1
#22
#end!
ps -ef|grep "phtu"|awk "/root/,/root/" # 只显示root所在行到root所在行的数据,区间选择
sed 根据定位到的数据⾏修改数据
语法 sed [addr]X[options]
action表达式
p # 打印
s # 查找替换
d # 删除
a # 追加
c # 改变
i # 插入数据,位置是匹配行之前
-e cmd
sed -n '2p' # 打印第二行 -n 表示只显示匹配行
sed 's#hello#world#'
sed -i 直接修改源文件
-E 扩展表达式
-debug 调试
-f 执行文件来处理输入的文本文件
-n 仅显示处理后的结果
sed '$d' /tmp/1 # 删除最后一行
sed 's/a/gr/' /tmp/1 # 把文件中的a替换成gr
sed 's#a#gr#' /tmp/1 # 同上
sed 's#1$#100#' /tmp/1 # 把结尾的1替换成100
sed 's#1#100#' /tmp/1 # 把第一个寻到的1替换成100
sed 's#1#100#g' /tmp/1 # 把所有匹配到的1替换成100,g相当的正则表达式的flag中的g
sed 's/:/123&/' /tmp/1 # &代表匹配到的字符,在:前加上123
sed 's#([1-3]) ([1-3]) ([1-3])#\1 \3 \2# /tmp/1 # 括号表示分组,\1代表匹配到的第一个分组\3表示第三个分组,匹配到数字3 2 1替换成3 1 2
sed '/a/i123' /tmp/1 # 匹配到a所在行,在这行前加上123
echo 'adc' | sed '/d/c123/' # 匹配到d所在行,把这行改为123
uniq 检查及删除文本文件中重复出现的行列(相邻位置)
uniq -c # 在每列前显示重复显示的次数
uniq -d # 仅显示重复出现的行列
uniq -u # 仅显示出现一次的行列
uniq -w<字符位置> # 指定比较的字符位置
uniq -f<栏位> # 忽略比较指定的栏位
uniq -s<字符位置> # 忽略比较指定的字符位置
排序 sort
sort -n # 按数值大小排序
sort -r # 反向排序
sort -b # 忽略每行开头的空白符
awk '{print $1}'
课后作业1
找出状态为404 405的地址
1.grep -E '[.?] "GET .?" (404|405)' /tmp/nginx.log |wc -l
2.awk '$9~/(404|405)/{print $0}'
课后作业2
找出访问量前3的ip地址
cat /tmp/nginx.log | awk '{print $1}'| sort -n | uniq -c | sort -rn | head -n 3
课后作业3
访问首页()的平均响应时间(倒数第二个字段值)
less /tmp/nginx.log | awk "$6=''"|awk "{s+=$(NF-1)}END{print s/NR}"
bash语法
变量
字符串
name="tester"
readonly name # 只读变量
sex="boy"
unset set # 删除变量(不能删除只读变量)
sex="gril"
out="$name"" is a ""$sex"
数组
array_name=(val0 val1 val2)
out=${array_name[1]} # 取值
array_name[0]="ddd"
echo ${array_name[*]} # 打印所有数组值
控制语句
if
a=1
b=3
if [ $a -eq $b ]; then echo "true";else echo "false";fi
if [ $a -gt $b ]; then echo "more than";elif [ $a -l
t $b ];then echo "lese than";else "nonono";fi
for
for loop in 1 2 3 4
do
echo "now is ""$loop"
done
# 打印 test.txt每一行的内容
vim test.txt
for i in $(cat test.txt)
do
echo $i
done
while
while read i;do echo $i ; done<test.txt
脚本
read命令
从标准输入读取输入并赋值给变量
read var
read var1 var2 var3
read # 默认赋值给REPLY
脚本参数传递
$0 脚本名称
$1 ~ $n 获取参数
$# 传递到脚本的参数个数
$$ 脚本运行的当前进程ID号
$* 以一个单字符串显示所有向脚本传递的参数
$? 显示最后命令的退出状态 0表示没有错误
算术运算
a=1
b=2
`expr $a + $b`
`expr $a - $b`
`expr $a \* $b`
`expr $a / $b`
执行脚本文件.sh
vim test.sh
bash test.sh