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

三、路径简写

  1. echo ~ 当前用户的主目录
  2. 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 删除文件

  1. 删除目录 rm -r
  2. 增加删除确认 rm -ri

十四、cp 复制

  1. cp ./1.txt ./a 复制文件到a文件夹
  2. cp -a ./a ./b/ -a参数 复制文件夹

十五、mv 移动文件/重命名

  1. 重命名 mv 1.txt 2.txt
  2. 移动文件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 }'
按行对数据进行处理

  1. 字段变量
-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
posted @ 2022-04-29 16:08  丛影HHZ  阅读(64)  评论(0编辑  收藏  举报