-
Notifications
You must be signed in to change notification settings - Fork 1
/
shell学习.txt
215 lines (180 loc) · 5.59 KB
/
shell学习.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
1、grep 学习
grep一般格式为:
grep [选项]基本正则表达式[文件]
基本正则表达式可为字符串
grep egrep fgrep区别:
grep 打印匹配模式的行
egrep = grep -E 匹配正则表达式 用""
fgrep = grep -F 匹配字符串 用''
举例:
查找名字中包含gdb的文件,从根目录开始包含子目录
find / |grep gdb
查找当前目录下所有.c文件中file ID
grep --include=*.c -r ' DRV_FILE_ID ' ./*
find -name *.c | xargs grep main
查找所有含---或者+++的行
grep -E -e ’---|\+\+\+’
查找时包含特定字符前后两行的数据
grep linux -C 2
2、使用反短斜线`可以将一个命令的输出作为另外一个命令的一个命令行参数。
3、单引号更严格一些,它可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。模式匹配用单引号。
4、分号和换行等价。
5、$#:参数个数 $@:参数列表 $?:上个前台进程返回值 $$: pid。
6、调试:脚本中插入 read $A 这样等用户按键后脚本才会继续运行
7、匹配空行:^[\s]*$
8、参数列表超长问题解决
[root@www ~]# grep '\*' $(find / -type f)
-bash: /bin/grep: Argument list too long
每次处理10个
[root@www ~]# find / -type f | xargs -n 10 grep '\*'
9、信息输出
把正确和错误信息全部输出到文件
[dmtsai@www ~]$ find /home -name .bashrc > file 2>&1
把正确和错误信息全部丢弃
[dmtsai@www ~]$ find /home -name .bashrc > /dev/null 2>&1
10、判断命令行的通用写法
if ! echo $* | grep -P -q -x "(mrpnc|mrpne|all)( debug| release)?"; then
echo "Usage: buildall_cr.sh { mrpnc | mrpne | all } [debug | release]"
exit 1
fi
判断条件也可改为
echo $* | grep -P -x "(mrpnc|mrpne|all)\s?(debug|release)?";
逐个输入参数判断
PRODUCT=${1?"Please input board: sr8800"}
shift 1
BOARD=${1?"Please input board: mpu_xlp lpu_rmi lpu_xlp"}
11、用 source 或小数点 (.) 都可以将配置文件的内容读到目前的 shell 环境
12、set -o noglob 可以禁止通配符扩展 set +o noglob
13、查看io高进程
echo 1 > /proc/sys/vm/block_dump
dmesg | egrep -n 'READ|WRITE|dirtied' | awk '{print $2}' | sort | uniq -c | sort -nr | head
查看完毕
echo 0 > /proc/sys/vm/block_dump
14、查看子进程的父进程
ps afx树状显示
ps -ef
15、按某列排序
sort -t' ' -k 2 // -t' '指定空格分隔符 -k 2 第二列
16、修改和恢复当前工作目录pwd
pushd dir //dir入栈做为pwd
popd //恢复pwd
17、查看端口所在进程
netstat -anp
18、查看进程所在路径
pwdx pid
lsof -p pid
19、tree乱码 :tree --charset ASCII
20、source命令用法:
source FileName
作用:在当前bash环境下读取并执行FileName中的命令。
注:该命令通常用命令“.”来替代。
如:source .bash_rc 与 . .bash_rc 是等效的。
注意:source命令与shell scripts的区别是,
source在当前bash环境下执行命令,而scripts是启动一个子shell来执行命令。
这样如果把设置环境变量(或alias等等)的命令写进scripts中,就只会影响子shell,无法改变当前的BASH,所以通过文件(命令列)设置环境变量时,要用source 命令。
21、查看每个文件的类型
find * -exec file {} \;
22、 set evn export 区别?
在Shell中有三种变量:内部变量,环境变量,用户变量。
内部变量:系统提供,不用定义,不能修改 如:$*, $?
环境变量:系统提供,不用定义,可以修改,可以利用export将用户变量转为环境变量.
用户变量:用户定义,可以修改 用户命令行中设置的变量
set 显示当前shell的变量(包括当前用户的变量和内部变量)
env 显示当前用户的环境变量
export 显示当前导出成用户变量的shell变量
23、正在表达式
匹配中文: [\u4e00-\u9fa5]
24、删除所有名字为release的目录
find -name release -type d| xargs rm -rf
25、实时查看网速
watch ifconfig eth0
26、查看io 网速 cpu 内存等等
dstat
27、samba后文件拒绝访问
smbstatus 分析,一般在拒绝访问的上级目录加权限即可
28、让子进程顺序执行
命令1 && 命令2:如果命令1执行成功那么执行命令2
命令1 || 命令2:如果命令1执行失败那么执行命令2
29、让samba支持软链接
sudo vim /etc/samba/smb.conf
在配置文件的“[global]”节的最后,加上下面三条设置:
follow symlinks = yes
wide links = yes
unix extensions = no
然后保存退出,最后重启下samba即可:
sudo /etc/init.d/smb restart
至此问题解决,可以正常访问软连接的文件了。
30、查看内核版本和发行版本
uname -a
cat /etc/redhat-release
31、修改进程打开最大文件数
1)ulimit -n 2048 对当前shell打开的进程有效
2)修改linux系统参数。vi /etc/security/limits.conf 添加
root soft nofile 65534 //root 是用户名,如果 * 为所有 用户
root hard nofile 65534
重新登录,所有进程永久生效
若要立即生效 source /etc/security/limits.conf
3)echo 65534 > /proc/sys/fs/file-max
这是所有进程一共能打开的文件数,对所有进程生效,重启失效
4)修改/etc/sysctl.conf, 加入
fs.file-max = 6553560
这是所有进程一共能打开的文件数,对所有进程生效,重启生效
若要立即生效 sudo sysctl -p
32、让linux进程在指定核上运行
1)显示进程运行的CPU
taskset -p 21184
2)指定进程运行在某个特定的CPU上
taskset -pc 3 21184
3)进程启动时指定CPU
taskset -c 2 ./redis-server ../redis.conf
33、切换root用户失败
$ su - root
su: cannot set groups: Operation not permitted
执行以下命令:
chown -R root:root /bin/su
chmod a+s /bin/su
ll /bin/su
-rwsrwsrwx 1 root root 23960 Mar 1 2010 /bin/su
34、查看进程打开的文件句柄
单个
lsof -p `ps aux | grep -m1 processnames| awk '{print $2}'`
全部
lsof -n |awk '{print $2 " " $3}'|sort|uniq -c |sort -nr|more
35、查看wwn
ls -l /dev/disk/by-id/
36、运行时查看和修改内核参数
sysctl
37、统计脚本运行时间
time bash cmd.sh
38、shell并发处理
不限并发进程数:
[root@station1 ~]# cat b.sh
#!/bin/bash
for((i=0;i<20;i++))
do
{
sleep 1
echo "bingfa"
}&
done
wait
限制并发进程数为3:
[root@station1 ~]# cat d.sh
#!/bin/bash
mkfifo fd2 #创建队列
exec 9<>fd2 #分配文件描述符9给队列
echo -n -e "1\n1\n1\n" 1>&9 #3次向队列输入1并换行
for((i=0;i<20;i++))
do
read -u 9 #从文件描述符9中读取一行,如果读空会一直等待
{ #your process
sleep 1 #每次子进程执行完等1秒
echo "$REPLY" #read 命令读取值默认保存在 $REPLY 于是会打印 1
echo -ne "1\n" 1>&9 #打印完再写1到队列,这样下次read可以继续重开3个子进程
} & #大括号内命令在后台执行,这样一次可以执行多个命令
done
wait #等待所有子进程结束
rm -f fd2
39、查看子进程个数
进程pid 6042为例:
cat /proc/*/status | grep PPid | grep 6042 | wc -l