Shell 脚本常用命令

1. 在 shell 中获取当前执行脚本的路径

1
2
3

current_dir=$(cd "$(dirname "$0")";pwd)
echo $current_dir

2. ls

2.1. 展示绝对路径

1
2
3
4
5
6
7
8
9
10
11
12
13
# 假如当前的目录结构为这样,在 a 目录需要删除包含字母 b 的 txt 文件:
.
|____a
| |____a.txt
|____b
| |____b.xtx
| |____c.txt
| |____bd.txt

bash-3.2$ ls ~/Downloads/test/b| /usr/local/bin/gsed "s:^:`pwd`/: "
/Users/MoMo/Downloads/test/a/b.xtx
/Users/MoMo/Downloads/test/a/bd.txt
/Users/MoMo/Downloads/test/a/c.txt

3. rm

3.1. 常用参数

rm 输出删除文件的明细: rm -rfv

  • r:删除目录;
  • f:直接删除,不询问;
  • v:输出删除的具体文件

3.2. ls 搭配使用的注意事项

通过 ls /usr/share/zoneinfo | grep | xargs rm -rfv 来删除文件的时候,需要先 cd 到 /usr/share/zoneinfo 的目录,否则,rm 会删除执行 ls 目录的文件,而不是 /usr/share/zoneinfo 这个目录的文件。

1
2
3
4
5
6
7
8
9
10
11
# 假如当前的目录结构为这样,在 a 目录需要删除包含字母 b 的 txt 文件:
.
|____a
| |____a.txt
|____b
| |____b.xtx
| |____c.txt
| |____bd.txt

# 这个命令不能生效,因为 ls 列出来的只是文件名,所以 rm 删除的时候,会在 a 目录下面去找,但是 a 没有,所以不能生效。
cd a;ls ~/Downloads/test/b | grep -i "b" | /usr/local/bin/gxargs xargs rm -rfv;

两个解决办法:

  1. ls 时添加上绝对路径
  2. 先 cd 到 b 目录,再 ls 删除。

4. cp

  1. cp 输出具体的操作明细: cp -v
    • v:输出copy 的文件

5. sed

5.1. 常用参数

  • -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
  • -e∶直接在指令列模式上进行 sed 的动作编辑www.it165.net;
  • -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
  • -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
  • -i∶直接修改读取的档案内容,而不是由萤幕输出。

5.2. 常用命令

  • a ∶ 新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行);
  • c ∶ 取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行;
  • d ∶ 删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i ∶ 插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p ∶ 列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作;
  • s ∶ 取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bash-3.2$echo "test-all.json" | gsed -e 's/\./-win\./g'
test-all-win.json

[root@localhost ruby] # sed ’1d’ ab #删除第一行
[root@localhost ruby] # sed ‘$d’ ab #删除最后一行
[root@localhost ruby] # sed ’1,2d’ ab #删除第一行到第二行
[root@localhost ruby] # sed ’2,$d’ ab #删除第二行到最后一行

显示某行
[root@localhost ruby] # sed -n ’1p’ ab #显示第一行
[root@localhost ruby] # sed -n ‘$p’ ab #显示最后一行
[root@localhost ruby] # sed -n ’1,2p’ ab #显示第一行到第二行
[root@localhost ruby] # sed -n ’2,$p’ ab #显示第二行到最后一行

使用模式进行查询
[root@localhost ruby] # sed -n ‘/ruby/p’ ab #查询包括关键字ruby所在所有行
[root@localhost ruby] # sed -n ‘/\$/p’ ab #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
Just for my love !!