Earth Guardian

You are not LATE!You are not EARLY!

0%

Linux Shell 命令及相关知识

Linux Shell 小知识汇总。

basename 获取文件名

描述:从带路径的字符串中获取文件名称,或者截取字符串。

1
2
3
4
5
6
7
8
9
10
11
var1=/usr/lib/abcdefg.so.bak  
var2=/usr/sbin/ifconfiggg
all_name=`basename $var1`
// 获取文件名称
sub_name1=`basename $var1 .bak`
// 截取字符串
sub_name2=`basename $var2 gg`

echo "all_name: $all_name" // all_name: abcdefg.so.bak
echo "sub_name1: $sub_name1" // sub_name1: abcdefg.so
echo "sub_name2: $sub_name2" // sub_name2: ifconfig

screen 的使用

作用:后台开启终端,执行各种命令。即使当前终端已经退出,不会影响 screen 的后台终端命令的执行。

新建和连接

1
2
screen -dmS back_xmt    // 新建
screen -r back_xmt // 连接

断开连接

断开连接只是回到当前终端,后台 screen 命令会继续执行。

  • 断开
    连接后,同时按下 ctrl+a 进入,再接着按 d,断开连接。
  • 关闭
    连接后,同时按下 ctrl+a 进入,再接着按 k,关闭连接。

& 挂后台

示例:vi 1.txt &
查看:jobs 查看挂后台有几个进程。
前置切换:fg 1 ,其中 1 表示 jobs 查看到的第一个程序。

管理普通用户

创建和删除用户

1
2
adduser fcopyuser
userdel fcopyuser

查看用户所在组 groups

1
2
root@ubuntu1404:~# groups xmt
xmt : xmt

管理用户组 gpasswd

  • 将用户加入管理员组:
1
2
gpasswd -a xmt sudo
gpasswd -a xmt adm

再次查看,账号已经具有管理员权限:

1
2
root@ubuntu1404:~# groups xmt
xmt : xmt adm sudo
  • 将用户移出某个组
    gpasswd -d xmt rootgroup

expect 功能

linux shell 命令行自动交互,比如自动登录,或者自动输入密码,可以使用 expect 功能。

安装

sudo apt-get install expect

示例

自动输入 scp 需要的密码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
CMD_EXPECT=/usr/bin/expect

function check_cmd_expect(){
if [ ! -f $CMD_EXPECT ];
then
echo "Please Install expect: sudo apt-get install expect!"
exit
fi
}

function scp_source(){
${CMD_EXPECT}<<EOF
set timeout 1200;
spawn /usr/bin/scp server@10.1.1.138:/home/server/test.tgz ./
expect "*password:"
send "server\r" // 自动填入密码 server
expect eof
EOF
}

check_cmd_expect
scp_source

crontab 定时任务

格式

格式:M H D m d cmd 。其中:

  • M: 分钟(0-59)
  • H:小时(0-23)
  • D:天(1-31)
  • m: 月(1-12)
  • d: 一星期内的天(0~6,0为星期天)
  • cmd 要运行的程序,程序被送入 sh 执行。

该命令中只有 USER, HOME, SHELL 这三个环境变量,如果需要使用其他环境变量,需要在 cmdexport 这些变量。

使用方法

  • crontab –l:查看当前的任务
  • crontab –e:编辑(新建)任务
  • crontab –r:删除任务表
  • sudo service cron restart:重启 crontab 服务

示例

定时执行脚本:

1
2
3
4
#定时每天 10 点 21 分执行脚本
21 10 * * * /home/xmt/share/Temp/delete/1.sh
#定时每隔 2 分钟执行脚本
*/2 * * * * /home/fcopyuser/HO9021/daily_build/daily_build.sh

TAR 常用命令

  • 压缩:tar zcf dest.tgz source
    注意:source 不要带路径,否则会将路径目录也压缩进去。如 /home/source,会把 home 这个目录也压缩到包中。
    压缩命令 z 表示用 gzip 压缩;如果不带 z 表示仅打包。
  • 解压:tar zxf dest.tgz
  • 不解压,直接查看压缩包有哪些文件:tar tvf dest.tgz
  • 分卷压缩
    tar zcf - test.pdf | split -b 5M - dir/test.tar.gz ,注意两个短横不能漏掉; -b 后面表示每卷最大值。

字符串操作

获取字符串中的数字

如:echo "ere1j32kk4" | tr -cd '[0-9\n]' #1324

当前时间 date

命令:date +%Y%m%d%H%M%S # 20141126104053 。格式:Y 年,m 月,d 日,H 小时,M 分,S 秒。

查看服务器上用户登录日志

cat /var/log/auth.log

把自己的命令添加到环境变量中

  • 新建 bin 目录:mkdir –p $HOME/bin
  • 新建可执行命令:touch my.sh ;chmod +x my.sh
  • bin 目录加入到环境变量中
    1
    2
    3
    root@ubuntu1404:~# vi ~/.bashrc
    # add my exec bin
    PATH=$PATH:$HOME/bin
  • 重新加载环境变量:source ~/.bashrc
  • 至此 bin 目录下所有可执行文件都加入到环境变量了

7z 格式文件操作

解压缩

示例 1 :当前目录解压:7za x po9041_20141202.7z
示例 2 :解压到指定目录:7za x po9041_20141202.7z -opo9041_20141202
其中 -o 后面不能有空格

压缩

使用 du 查看大小并按照大小排序

1
du -sh `du -s * | sort -rn| awk '{print $2}'`

开机自启动脚本

新建脚本

创建脚本后,并将脚本拷贝到 /etc/init.d/ 目录下。

1
2
3
4
sudo -s
touch new_service.sh
chmod +x new_service.sh
mv new_service.sh /etc/init.d/

update-rc.d 命令

update-rc.d 命令用来设置开机启动的优先级。

1
2
3
update-rc.d <basename> start|stop <order> <runlevels>
update-rc.d <basename> defaults <order>
update-rc.d -f <basename> remove

其中:update-rc.d sample_init_script defaults 命令等效于(中间是一个英文句点符号):update-rc.d sample_init_script start 20 2 3 4 5 . stop 20 0 1 6 .,表示在 2, 3, 4, 5 这五个运行级别中,由小到大第 20 个开始运行 sample_init_script;在 0 1 6 这 3 个运行级别中,第 20 个关闭 sample_init_script 。这是合并起来的写法,注意它有 2 个点号。
比如,我们将 gerrit_start 脚本放在第 99 顺位命令后执行:

1
2
3
4
5
6
7
8
9
10
11
root@gm-20180529:/etc/init.d# update-rc.d gerrit_start defaults 99
update-rc.d: warning: /etc/init.d/gerrit_start missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>
Adding system startup for /etc/init.d/gerrit_start ...
/etc/rc0.d/K99gerrit_start -> ../init.d/gerrit_start
/etc/rc1.d/K99gerrit_start -> ../init.d/gerrit_start
/etc/rc6.d/K99gerrit_start -> ../init.d/gerrit_start
/etc/rc2.d/S99gerrit_start -> ../init.d/gerrit_start
/etc/rc3.d/S99gerrit_start -> ../init.d/gerrit_start
/etc/rc4.d/S99gerrit_start -> ../init.d/gerrit_start
/etc/rc5.d/S99gerrit_start -> ../init.d/gerrit_start

sysv-rc-conf 命令

sysv-rc-conf 命令可以直观的查看,并勾选运行级别。

  • 安装:apt-get install sysv-rc-conf
  • 查看
1
2
3
4
root@gm-20180529:~# sysv-rc-conf
x service 1 2 3 4 5 0 6 S
x --------------------------------------------------------------------------
x gerrit_st$ [ ] [X] [X] [X] [X] [ ] [ ] [ ]

grep 常见操作

在指定文件类型中搜索

比如在 cpp, java, h 文件中搜索字符串 adjustment ,命令如下:

1
grep --include=*.{cpp,java,h} -irsn "adjustment" frameworks/

设置代理

在当前用户 shell 环境下设置代理,打开 ~/.bashrc 文件,添加如下代码:

1
2
3
4
# http_proxy
export http_proxy="ip:port"
export https_proxy="ip:port"
export no_proxy="localhost, 127.0.0.1, *.my.lan"

其中 ip:port 是代理服务器的地址以及开放的端口;重新连接或者执行 source ~/.bashrc 生效!验证结果:

1
2
3
4
5
6
7
8
9
10
xmt@server138:~$ wget https://www.google.com
--2019-05-17 17:40:28-- https://www.google.com/
Connecting to 10.50.100.113:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html.1’

[ <=> ] 11,889 --.-K/s in 0.02s

2019-05-17 17:40:29 (739 KB/s) - ‘index.html.1’ saved [11889]

数组

常用方法

数组:用一对括号来表示,并使用空格分隔。

  • 元素可以是使用双引号或者单引号,但都会当作字符串处理;如果数组元素中包含了空格,必须使用双引号
  • ${#array[*/@]} 获取数组长度, * 或者 @ 都可以
  • 数组可以通过下标来访问指定元素,也可以修改指定下标元素的值
1
2
3
4
5
6
7
8
9
10
11
12
array=("a" b 'c')               # 等号两边不能空格

echo "length: ${#array[*]}" # 数组长度
echo "All items: ${array[*]}" # 输出数组所有元素
echo "length: ${#array[@]}" # 数组长度,* 号可以使用 @ 替代
echo "All items: ${array[@]}" # 输出数组所有元素,* 号可以使用 @ 替代

echo "second item: ${array[1]}" # 数组可以使用下标来访问指定位置元素,位置从 0 开始
echo "first item: $array" # 数组的第一个元素,可以省略下标

array[1]=3 # 修改指定下标的值
echo "All items: ${array[*]}" # a 3 c

数组遍历的几种方式

1
2
3
4
5
6
7
8
9
10
11
# 标准 for 循环
for var in ${array[@]}
do
echo $var
done

# 带下标的 for 方便赋值或修改,也可以指定步进值
for ((i=0;i<${#array[@]};i++))
do
echo ${array[$i]}
done

数组配置在 conf 文件中

注意:在 conf 配置文件中,换行需要使用斜杠 \ 来作为分隔符,而在 sh 文件中是不需要的。

1
2
3
4
ARRAY_CONFIGS=(\
"dns" "clean uploadArchives" \
"moduletest" "clean uploadArchives" \
)

数组变量赋值

数组变量赋值给另一个变量:

  • 如果当前数组元素中没有空格(空格是数组分隔符,如果单个元素包含空格,可能会被判断为两个或多个元素)
  • 如果当前数组中包含空格,只能采取遍历方式赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 数组元素不包含空格
array1=("a" b 'c')
new_array1=(${array1[*]})

# 数组元素包含空格
array2=("a z" b "c")
new_array2=""
echo "length: ${#array2[@]}"
for ((i=0;i<${#array2[@]};i++))
do
new_array2[$i]=${array2[$i]}
done
#遍历这个新数组
echo "new length: ${#new_array2[@]}"
for ((i=0;i<${#new_array2[@]};i++))
do
echo ${new_array2[$i]}
done

参考文档