linux简单常用命令
1 用户相关
创建新用户、新账号(账户)
useradd -m -g 组 新建用户名
-m 自动建立用户家目录
-g 指定用户所在的组,否则会建立一个和用户名同名的组
最好加上 -m,否则没有家目录,还需要一些其他操作,-g可以不加
设置密码
passwd 用户名
Linux下对文件和文件夹切换所有者及所在组
chgrp 用户名 文件名 -R
切换所在组
chown 用户名 文件名 -R
切换所有者
-R:-R表示递归目录下所有文件
注意:
1)服务器涉及文件操作时报错可以检查下文件的所有者
2)在ROOT账户下执行
chown work /home/work/ -R
chgrp work /home/work/ -R
本页面由张康伟于2022/04/02迁移自wiki 张康伟空间
ls -lh
drwxrwxr-x 2 zhangkw zhangkw 4.0K Dec 26 16:49 log
-rw-rw-r-- 1 zhangkw zhangkw 583M Dec 26 16:49 part-07998
-rw-rw-r-- 1 zhangkw zhangkw 583M Dec 26 16:49 part-07998
文件属性:
+prwxr-xrw- p代表管道
查看所有tcp端口命令
netstat -tnlp
netstat -tapn
# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 4814/rpcbind
tcp 0 0 0.0.0.0:5908 0.0.0.0:* LISTEN 25492/qemu-kvm
tcp 0 0 0.0.0.0:6996 0.0.0.0:* LISTEN 22065/lwfs
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 38296/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 5278/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 5013/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 5962/master
tcp 0 0 0.0.0.0:8666 0.0.0.0:* LISTEN 44868/lwfs
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 22065/lwfs
参数说明:
-
-a或--all 显示所有连线中的Socket。
-
-A<网络类型>或--<网络类型> 列出该网络类型连线中的相关地址。
-
-c或--continuous 持续列出网络状态。
-
-C或--cache 显示路由器配置的快取信息。
-
-e或--extend 显示网络其他相关信息。
-
-F或--fib 显示路由缓存。
-
-g或--groups 显示多重广播功能群组组员名单。
-
-h或--help 在线帮助。
-
-i或--interfaces 显示网络界面信息表单。
-
-l或--listening 显示监控中的服务器的Socket。
-
-M或--masquerade 显示伪装的网络连线。
-
-n或--numeric 直接使用IP地址,而不通过域名服务器。
-
-N或--netlink或--symbolic 显示网络硬件外围设备的符号连接名称。
-
-o或--timers 显示计时器。
-
-p或--programs 显示正在使用Socket的程序识别码和程序名称。
-
-r或--route 显示Routing Table。
-
-s或--statistics 显示网络工作信息统计表。
-
-t或--tcp 显示TCP传输协议的连线状况。
-
-u或--udp 显示UDP传输协议的连线状况。
-
-v或--verbose 显示指令执行过程。
-
-V或--version 显示版本信息。
-
-w或--raw 显示RAW传输协议的连线状况。
-
-x或--unix 此参数的效果和指定"-A unix"参数相同。
-
--ip或--inet 此参数的效果和指定"-A inet"参数相同。
命令无法运行:
LD_PRELOAD=/path/to/ld-linux-x86-64.so.2 /bin/cp source_file destination_file
使用LD_PRELOAD预编译
创建新用户、新账号(账户)
useradd -m -g 组 新建用户名
-m 自动建立用户家目录
-g 指定用户所在的组,否则会建立一个和用户名同名的组
最好加上 -m,否则没有家目录,还需要一些其他操作,-g可以不加
设置密码
passwd 用户名
创建组
groupadd <组名>
登录账号后,可能发现用户下没有文件夹,可以输入
xdg-user-dirs-update
再次进入账户,就可以看到文件夹了,输入
cat /etc/passwd
可以看到用户信息,例如
username: x:1000:1000::/home/username:/bin/bash
如果用户下显示username: x:1000:1000::/home/username:,输入
usermod -s /bin/bash 用户名
就可以了
修改用户的主组和附加组
usermod -g 组 用户名 (修改用户的主组)
usermod -G 组 用户名(修改用户的附加组)
删除用户
userdel -r 用户名
查找当前目录下,包含“Hello”字符串的所有文件
(其中,r 表示递归, n表示查询结果显示行号):
grep -rn "Hello" ./
将要找的字符串标亮
grep -rn --color "diskResourcesSize" ./
grep -v "OK"
grep -v 表示不包含某个字符串。
将当前目录及其子目录下所有文件后缀为 .c 的文件列出来:
find . -name "*.c"
将当前目录及其子目录中的所有文件列出:
find . -type f
查找目录:find /(查找范围) -name '查找关键字' -type d
查看环境变量
env
export
查看路径设置
echo $PATH
查看日志 前 n行:
1、 cat 文件名 | head -n 数量
demo
cat test.log | head -n 100 # 查看test.log前100行
查看日志 尾 n行:
2、 cat 文件名 | tail -n 数量
demo
cat test.log |tail -n 100 # 查看test.log倒数100行
可以用这条命令对某个服务日志情况进行探查,查看是否有人在用:
tail -f XXX
查看某个进程的情况:
ps -ef|grep redis
ps获得的字段含义分别是:
UID PID PPID C STIME TTY TIME CMD
zzw 14124 13991 0 00:38 pts/0 00:00:00 grep --color=auto dae
获得进程号:8988
通过 ll /proc/8988 来看exe在哪:/home/root/fcsecalc/bin/redis
1.UID 用户ID
2.PID 进程ID
3.PPID 父进程ID
4.C CPU占用率
5.STIME 开始时间
6.TTY 开始此进程的TTY----终端设备
7.TIME 此进程运行的总时间
8.CMD 命令名
2.PID 进程ID
3.PPID 父进程ID
4.C CPU占用率
5.STIME 开始时间
6.TTY 开始此进程的TTY----终端设备
7.TIME 此进程运行的总时间
8.CMD 命令名
查看线程和进程
ps xH
查看进程开始和使用的准确时间
[root@iZ25p102vo3Z ~]# ps -eo pid,lstart,etime,cmd | grep nginx
16968 Fri Mar 4 16:04:27 2016 41-21:14:04 nginx: master process /usr/sbin/nginx
17826 Fri Mar 4 22:53:51 2016 41-14:24:40 nginx: worker process
18312 Fri Apr 15 13:18:31 2016 00:00 grep --color=auto nginx
16968 Fri Mar 4 16:04:27 2016 41-21:14:04 nginx: master process /usr/sbin/nginx
17826 Fri Mar 4 22:53:51 2016 41-14:24:40 nginx: worker process
18312 Fri Apr 15 13:18:31 2016 00:00 grep --color=auto nginx
2016年开始 运行了41天21小时...
重定向命令列表如下:
|
命令
|
说明
|
|
command > file
|
将输出重定向到 file。
|
|
command < file
|
将输入重定向到 file。
|
|
command >> file
|
将输出以追加的方式重定向到 file。
|
|
n > file
|
将文件描述符为 n 的文件重定向到 file。
|
|
n >> file
|
将文件描述符为 n 的文件以追加的方式重定向到 file。
|
|
n >& m
|
将输出文件 m 和 n 合并。
|
|
n <& m
|
将输入文件 m 和 n 合并。
|
|
<< tag
|
将开始标记 tag 和结束标记 tag 之间的内容作为输入。
|
可以通过 shell命令 ./output/bin/aync_bs_asan> log.txt 2>&1 来将标准输出和标准错误 追加到文件log.txt中。
-
/dev/null 表示空设备文件
-
0 表示stdin标准输入
-
1 表示stdout标准输出
-
2 表示stderr标准错误
压缩文件:
不同的后缀的文件解压和压缩的命令都不一样
总结一下
1、*.tar 用 tar –xvf 解压
2、*.gz 用 gzip -d或者gunzip 解压
3、*.tar.gz和*.tgz 用 tar –xzf 解压
4、*.bz2 用 bzip2 -d或者用bunzip2 解压
5、*.tar.bz2用tar –xjf 解压
6、*.Z 用 uncompress 解压
7、*.tar.Z 用tar –xZf 解压
8、*.rar 用 unrar e解压
9、*.zip 用 unzip 解压
总结一下
1、*.tar 用 tar –xvf 解压
2、*.gz 用 gzip -d或者gunzip 解压
3、*.tar.gz和*.tgz 用 tar –xzf 解压
4、*.bz2 用 bzip2 -d或者用bunzip2 解压
5、*.tar.bz2用tar –xjf 解压
6、*.Z 用 uncompress 解压
7、*.tar.Z 用tar –xZf 解压
8、*.rar 用 unrar e解压
9、*.zip 用 unzip 解压
打包成tar.gz格式压缩包
# tar -zcvf renwolesshel.tar.gz /renwolesshel
解压tar.gz格式压缩包
# tar -zxvf renwolesshel.tar.gz
打包成tar.bz2格式压缩包
# tar -jcvf renwolesshel.tar.bz2 /renwolesshel ......多个文件或文件夹空格间隔
打包成.gz格式压缩包
# gzip 要打包的文件
gzip test.csv
-> test.csv.gz
解压tar.bz2格式的压缩包
# tar jxvf renwolesshel.tar.bz2
压缩成zip格式
# zip -q -r renwolesshel.zip renwolesshel/
解压zip格式的压缩包
# unzip renwolesshel.zip
1、把文件解压到当前目录下
unzip test.zip
2、如果要把文件解压到指定的目录下,需要用到-d参数。
unzip -d /temp test.zip
3、解压的时候,有时候不想覆盖已经存在的文件,那么可以加上-n参数
unzip -n test.zip
unzip -n -d /temp test.zip
unzip -n -d /temp test.zip
4、只看一下zip压缩包中包含哪些文件,不进行解压缩
unzip -l test.zip
5、查看显示的文件列表还包含压缩比率
unzip -v test.zip
6、检查zip文件是否损坏
unzip -t test.zip
7、将压缩文件test.zip在指定目录tmp下解压缩,如果已有相同的文件存在,要求unzip命令覆盖原先的文件
unzip -o test.zip -d /tmp/
表 1 zip 命令常用选项及含义
|
选项
|
含义
|
|
-r
|
递归压缩目录,及将制定目录下的所有文件以及子目录全部压缩。
|
|
-m
|
将文件压缩之后,删除原始文件,相当于把文件移到压缩文件中。
|
|
-v
|
显示详细的压缩过程信息。
|
|
-q
|
在压缩的时候不显示命令的执行过程。
|
|
-压缩级别
|
压缩级别是从 1~9 的数字,-1 代表压缩速度更快,-9 代表压缩效果更好。
|
|
-u
|
更新压缩文件,即往压缩文件中添加新文件。
|
cp -r 要复制文件 复制到的目录
df -h 查看磁盘占用情况
du -h 查看某个文件夹中存储占用
df -i 查看磁盘iNode占用情况
一般遇到磁盘满了报警,用du -sh /文件夹 来查看某个文件夹所有的文件所占大小
du -h --max-depth=0 * : 查看文件夹下各个文件的大小,其中,0 代表查看 本文件夹(在这儿是app文件夹)的一级子文件或子目录的大小,如果改成 1 ,则可以查看一级子文件夹、一级子文件、二级子文件夹、二级子文件的大小,依次类推,如果改成 2 ,则可以查看一级子文件夹、一级子文件、二级子文件夹、二级子文件的大小,、三级子文件夹、三级子文件的大小......
-
例如我想得到根目录下所有目录或文件的占用空间大小,并且想要排除名字中包含 proc 的文件或目录,可以使用如下命令
-
du -sh /* --exclude="proc"
hostname -i 查看本机IP地址
数据的搜寻并替换
除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:
sed -i 's/要被取代的字串/新的字串/g' ...txt
sed中的c\命令,这个命令和s/xxx/xxxx/g不同的是,使用c\能把当前sed查找到的一行全部替换成我们指定的TEXT
比如 sed -i "/734/c\Hello" install.log ,这样就把包含有734这样字符串的整个一行替换成了Hello
比如 sed -i "/734/c\Hello" install.log ,这样就把包含有734这样字符串的整个一行替换成了Hello
在使用c\的时候需要注意,如果我们在c\命令后面加的不是一个常数字符串,而是一个变量,那么,要再加一个\符号来解引用,否则变量无法正常解析:
sed -i "/734/c\$Hello" install.log -- 含有734的一行被替换成了$Hello
sed -i "/734/c\\$Hello" install.log -- 含有734的一行被替换成了Hello变量中的值
sed -i "/734/c\$Hello" install.log -- 含有734的一行被替换成了$Hello
sed -i "/734/c\\$Hello" install.log -- 含有734的一行被替换成了Hello变量中的值
此时,当我们需要编辑文件的第一列时,只需要将上述命令中的g改为1即可,命令如下:
sed -i 's/a/1/1' test.txt
同理,如果是对第二列进行替换,则命令为
sed -i 's/a/1/2' test.txt
若报错:
sed: 1: "sample_gender_t.txt": unterminated substitute pattern
只能用 sed -e 's/user//g' sample_gender_t.txt > sample_gender_t_n.txt
iptables防火墙:
iptables -I INPUT -s 10.227.103.142 -j DROP
iptables清除防火墙所有配置规则
命令如下:
iptables -F (flush 清除所有的已定规则)
iptables -X (delete 删除所有用户“自定义”的链(tables))
iptables -Z (zero 将所有的chain的计数与流量统计都归零)
iptables -F (flush 清除所有的已定规则)
iptables -X (delete 删除所有用户“自定义”的链(tables))
iptables -Z (zero 将所有的chain的计数与流量统计都归零)
iptables语法格式
iptables 命令的基本语法格式如下:
[root@bogon ~]# iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
各参数的含义为:
-
-t:指定需要维护的防火墙规则表 filter、nat、mangle或raw。在不使用 -t 时则默认使用 filter 表。
-
COMMAND:子命令,定义对规则的管理。
-
chain:指明链表。
-
CRETIRIA:匹配参数。
-
ACTION:触发动作。
iptables 命令常用的选项及各自的功能如表 2 所示。
|
选 项
|
功 能
|
|
-A
|
添加防火墙规则
|
|
-D
|
删除防火墙规则
|
|
-I
|
插入防火墙规则
|
|
-F
|
清空防火墙规则
|
|
-L
|
列出添加防火墙规则
|
|
-R
|
替换防火墙规则
|
|
-Z
|
清空防火墙数据表统计信息
|
|
-P
|
设置链默认规则
|
iptables 命令常用匹配参数及各自的功能如表 3 所示。
|
参 数
|
功 能
|
|
[!]-p
|
匹配协议,! 表示取反
|
|
[!]-s
|
匹配源地址
|
|
[!]-d
|
匹配目标地址
|
|
[!]-i
|
匹配入站网卡接口
|
|
[!]-o
|
匹配出站网卡接口
|
|
[!]--sport
|
匹配源端口
|
|
[!]--dport
|
匹配目标端口
|
|
[!]--src-range
|
匹配源地址范围
|
|
[!]--dst-range
|
匹配目标地址范围
|
|
[!]--limit
|
四配数据表速率
|
|
[!]--mac-source
|
匹配源MAC地址
|
|
[!]--sports
|
匹配源端口
|
|
[!]--dports
|
匹配目标端口
|
|
[!]--stste
|
匹配状态(INVALID、ESTABLISHED、NEW、RELATED)
|
|
[!]--string
|
匹配应用层字串
|
iptables 命令触发动作及各自的功能如表 4 所示。
|
触发动作
|
功 能
|
|
ACCEPT
|
允许数据包通过
|
|
DROP
|
丢弃数据包
|
|
REJECT
|
拒绝数据包通过
|
|
LOG
|
将数据包信息记录 syslog 曰志
|
|
DNAT
|
目标地址转换
|
|
SNAT
|
源地址转换
|
|
MASQUERADE
|
地址欺骗
|
|
REDIRECT
|
重定向
|
内核会按照顺序依次检查 iptables 防火墙规则,如果发现有匹配的规则目录,则立刻执行相关动作,停止继续向下查找规则目录;如果所有的防火墙规则都未能匹配成功,则按照默认策略处理。使用 -A 选项添加防火墙规则会将该规则追加到整个链的最后,而使用 -I 选项添加的防火墙规则则会默认插入到链中作为第一条规则。
Linux下对文件和文件夹切换所有者及所在组
chgrp 用户名 文件名 -R
切换所在组
chown 用户名 文件名 -R
切换所有者
-R:-R表示递归目录下所有文件
注意:
1)服务器涉及文件操作时报错可以检查下文件的所有者
2)在ROOT账户下执行
chown work /home/work/ -R
chgrp work /home/work/ -R
Linux crontab是用来定期执行程序的命令:
-
-e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
-
-r : 删除目前的时程表
-
-l : 列出目前的时程表
一般是crontab -e得到时间事件列表
然后再编辑列表
时间格式如下:
f1 f2 f3 f4 f5 program
-
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
-
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
-
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
-
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
-
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推
* * * * *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
使用者也可以将所有的设定先存放在文件中,用 crontab file 的方式来设定执行时间。
例如:
每个月在2号,12:00上传脚本
crontab -l
0 12 2 * * sh -x /home/work/archer/chanpingjuntan/chanpingjuntan.sh >> /home/work/archer/chanpingjuntan/chanpingjuntan.log 2>&1
0 12 2 * * sh -x /home/work/archer/chanpingjuntan/chanpingjuntan.sh >> /home/work/archer/chanpingjuntan/chanpingjuntan.log 2>&1
注意相对路径和绝对路径,work用户的crontab一般以/home/work为基准目录
crontab中的定时任务有时候没有成功执行,什么原因呢?这时就需要去日志里去分析一下了,那该如何查看crontab的日志记录呢?
1. linux
看 /var/log/cron这个文件就可以,可以用 tail -f /var/log/cron 观察
上面的/var/log/cron只会记录是否执行了某些计划的脚本,但是具体执行是否正确以及脚本执行过程中的一些信息则linux会每次都发邮件到该用户下。
linux会发邮件到/var/spool/mail下面
# 查看crontab 状态[root@dev-gl-lh1 ApiAgent]# /etc/init.d/crond status
crond dead but pid file exists
# 启动crontab 服务[root@dev-gl-lh1 ApiAgent]# /etc/init.d/crond start
Starting crond:
Linux如何删除未知文件名的文件
# 查看文件的inode号
ls -il
ls -il
可以看到文件的
inode号为 393743然后通过下面命令进行删除
使用find根据inode号查找到文件 再删除
$ find . -inum 393743 -exec rm -i {} \;
ls -l 命令放在 find 命令的 -exec 选项中
$ find . -inum 393743 -exec ls -l {} \;
注意 {} 前后都有空格
或者不需要交互, 直接使用delete进行删除
$ find . -inum 393743 -delete
查看端口是否能连接:
telnet ip 端口
telnet 10.205.166.4 2010
查看Linux系统 64 or 32 位
1.#uname -a如果有x86_64就是64位的,没有就是32位的
这是64位的 # uname -a Linux WORKS 2.6.9-11.ELsmp #1 SMP Fri May 20 18:25:30 EDT 2005 x86_64 x86_64 x86_64 GNU/Linux 这是32位的 #uname -a Linux backup 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:58:04 EST 2007 i686 i686 i386 GNU/Linux 注意:Ixxx的全是32位的,有X86—64的全是64位2.# uname -mx86_643.# archx86_64
linux 标准输入输出:
./bin/aync_demo 2&>b.log
将标准输出到b.log中
环境变量查看,更改,局部环境变量更改:
临时更改:在命令栏输入export PATH="$PATH:/home/user/bin"
查看:echo $PATH
以临时环境变量执行:
env LD_LIBRARY_PATH=/home/opt/compiler/gcc-8.2/gcc-8.2/lib/:/usr/lib64:/lib64:${LD_LIBRARY_PATH} output/bin/hdfs_table_size
Linux的fd数量限制查询
1)Linux系统下,所有进程允许打开的最大fd数量。查询语句:
/proc/sys/fs/file-max
2)Linux系统下,所有进程已经打开的fd数量及允许的最大数量。查询语句:
/proc/sys/fs/file-nr
3)单个进程允许打开的最大fd数量.查询语句:
ulimit -n
4)单个进程(例如进程id为5454)已经打开的fd.查询语句:
ls -l /proc/5454/fd/
删除history记录
history -c
查看该用户进程中线程的状况
ps xH
其中STAT状态位常见的状态字符有
D //无法中断的休眠状态(通常 IO 的进程);
R //正在运行可中在队列中可过行的;
S //处于休眠状态;
T //停止或被追踪;
W //进入内存交换 (从内核2.6开始无效);
X //死掉的进程 (基本很少见);
Z //僵尸进程;
< //优先级高的进程
N //优先级较低的进程
L //有些页被锁进内存;
s //进程的领导者(在它之下有子进程);
l //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ //位于后台的进程组;
R //正在运行可中在队列中可过行的;
S //处于休眠状态;
T //停止或被追踪;
W //进入内存交换 (从内核2.6开始无效);
X //死掉的进程 (基本很少见);
Z //僵尸进程;
< //优先级高的进程
N //优先级较低的进程
L //有些页被锁进内存;
s //进程的领导者(在它之下有子进程);
l //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ //位于后台的进程组;
ps xH|wc -l 查看线程总数
find 根据日期删除文件
-amin -n: 最后一次访问发生在 n分钟 之内
-amin n: 最后一次访问发生在距离当前时间 n分钟 至 (n+1)分钟
-amin +n: 最后一次访问发生在 (n+1)分钟 之外
-atime -n: 最后一次访问发生在 n天 之内
-atime n: 最后一次访问发生在 n天 至 (n+1)天
-atime +n: 最后一次访问发生在 (n+1)天 之外
-cmin -n: 最后一次文件状态修改发生在 n分钟 之内
-cmin n: 最后一次文件状态修改发生在 n分钟 至 (n+1)分钟
-cmin +n: 最后一次文件状态修改发生在 (n+1)分钟 之外
-ctime -n: 最后一次文件状态修改发生在 n天 之内
-ctime n: 最后一次文件状态修改发生在 n天 至 (n+1) 天
-ctime +n: 最后一次文件状态修改发生在 (n+1)天 之外
-mmin -n: 最后一次文件内容修改发生在 n分钟 之内
-mmin n: 最后一次文件内容修改发生在 n分钟 至 (n+1)分钟
-mmin +n: 最后一次文件内容修改发生在 (n+1)分钟 之外
-mtime -n: 最后一次文件内容修改发生在 n天 之内
-mtime n: 最后一次文件内容修改发生在 n天 至 (n+1)天
-mtime +n: 最后一次文件内容修改发生在 (n+1)天 之外
find . -name "*" -mtime +2
# 利用 -exec参数,如果查找有返回,可在exec参数后加上需要操作的命令,查找结果用{}来代替
find . -name "*" -mtime +2 -exec rm -rf {} \;
用iostat查看磁盘io 是否读写负载很高
使用命令:iostat -x 1 10
如果 iostat 没有,要 yum install sysstat安装这个包
第一眼看下图红框处指标,如果%util接近100%,表明I/O请求太多,I/O系统已经满负荷,磁盘可能存在瓶颈,一般%util大于70%,I/O压力就比较大,读取速度有较多的wait,然后再看其他的参数,
指标详情:
rrqm/s:每秒进行merge的读操作数目。即delta(rmerge)/s
wrqm/s:每秒进行merge的写操作数目。即delta(wmerge)/s
r/s:每秒完成的读I/O设备次数。即delta(rio)/s
w/s:每秒完成的写I/0设备次数。即delta(wio)/s
rsec/s:每秒读扇区数。即delta(rsect)/s
wsec/s:每秒写扇区数。即delta(wsect)/s
rKB/s:每秒读K字节数。是rsec/s的一半,因为每扇区大小为512字节
wKB/s:每秒写K字节数。是wsec/s的一半
avgrq-sz:平均每次设备I/O操作的数据大小(扇区)。即delta(rsect+wsect)/delta(rio+wio)
avgqu-sz:平均I/O队列长度。即delta(aveq)/s/1000(因为aveq的单位为毫秒)
await:平均每次设备I/O操作的等待时间(毫秒)。即delta(ruse+wuse)/delta(rio+wio)
svctm:平均每次设备I/O操作的服务时间(毫秒)。即delta(use)/delta(rio+wio)
%util:一秒中有百分之多少的时间用于I/O操作,或者说一秒中有多少时间I/O队列是非空的
lsb_release -a
三、查看Linux版本
1.查看系统版本信息的命令 lsb_release -a
(使用命令时提示command not found,需要安装yum install redhat-lsb -y)
[root@localhost ~]# lsb_release -a
LSB Version: :core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0- noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: CentOS
Description: CentOS Linux release 6.0 (Final)
Release: 6.0
Codename: Final
注:这个命令适用于所有的linux,包括RedHat、SUSE、Debian等发行版。
2.查看centos版本号 cat /etc/issue
CentOS release 6.9 (Final)
Kernel \r on an \m
3.使用 file /bin/ls
scp (选项) (参数)
选项
-1:使用ssh协议版本1;
-2:使用ssh协议版本2;
-4:使用ipv4;
-6:使用ipv6;
-B:以批处理模式运行;
-C:使用压缩;
-F:指定ssh配置文件;
-l:指定宽带限制;
-o:指定使用的ssh选项;
-P:指定远程主机的端口号;
-p:保留文件的最后修改时间,最后访问时间和权限模式;
-q:不显示复制进度;
-r:以递归方式复制。
参数
源文件:指定要复制的源文件。
目标文件:目标文件。格式为user@host:filename(文件名为目标文件的名称)。
示例
从远程复制到本地的scp命令与上面的命令雷同,只要将从本地复制到远程的命令后面2个参数互换顺序就行了。
从远处复制文件到本地目录
scp root@10.10.10.10:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/
从10.10.10.10机器上的/opt/soft/的目录中下载nginx-0.5.38.tar.gz 文件到本地/opt/soft/目录中。
从远处复制到本地
scp -r root@10.10.10.10:/opt/soft/mongodb /opt/soft/
从10.10.10.10机器上的/opt/soft/中下载mongodb目录到本地的/opt/soft/目录来。
上传本地文件到远程机器指定目录
scp /opt/soft/nginx-0.5.38.tar.gz root@10.10.10.10:/opt/soft/scptest
复制本地/opt/soft/目录下的文件nginx-0.5.38.tar.gz到远程机器10.10.10.10的opt/soft/scptest目录。
上传本地目录到远程机器指定目录
scp -r /opt/soft/mongodb root@10.10.10.10:/opt/soft/scptest
上传本地目录/opt/soft/mongodb到远程机器10.10.10.10上/opt/soft/scptest的目录中去。
scp -v 可以显示执行过程的详细信息,以找到scp无法传输过去的问题
linux下怎么查看cpu核数
1、查看CPU型号
cat /proc/cpuinfo | grep name | sort | uniq
2、查看物理CPU数目
cat /proc/cpuinfo | grep "physical id"
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
3、查看每个物理CPU中的core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
4、查看逻辑CPU数目
cat /proc/cpuinfo| grep "processor"| wc -l
5、如果不想自己算,也可以直接lscpu
批量杀死进程
ps -ef | grep rtprecv | grep -v grep | awk '{print $2}' | xargs kill -9
解释一下:
ps -ef 用于获取当前系统所有进程,如上图所示。
grep rtprecv 过滤出与“rtprecv”字符相关的数据(以行为单位)。
grep -v grep 的作用是除去本次操作所造成的影响,-v 表示反向选择。
awk '{print $2}' 表示筛选出我们所关注的进程号,$2 表示每行第二个变量,在这个例子中就是进程号。所以如果你使用ps工具不一样,或者ps带的参数不一样,那需要关注的就可能不是$2,可能是$1 。
xargs kill -9 中的 xargs 命令表示用前面命令的输出结果(也就是一系列的进程号)作为 kill -9 命令的参数,-9 表示强制终止,不是必须的。
查看端口是否被占用
TCPListeningnum=`netstat -an | grep ":$1 " | awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' | wc -l`
UDPListeningnum=`netstat -an | grep ":$1 " | awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}' | wc -l`
nohup 命令
用途:不挂断地运行命令。
语法:nohup Command [ Arg … ] [ & ]
描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部。
cat dealwithm |xargs -i host {}|awk '{print $NF}'|cut -d "." -f 1,2
xargs -i {} 挨个执行{}
-a file 从文件中读入作为sdtin
-e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
-p 当每次执行一个argument的时候询问一次用户。
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
-t 表示先打印命令,然后再执行。
-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
-s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
-L num 从标准输入一次读取 num 行送给 command 命令。
-l 同 -L。
-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
-x exit的意思,主要是配合-s使用。。
-P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。
cut [选项] 文件 //截取文件的内容
-d 表示按自定义分割符查找,默认为tab
-f 截取 列数
cut -d "." -f 1,2 以.为分割选取第1,2段
查看Linux磁盘被哪些进程占用未释放
# 显示所有打开的链接数小于1的文件
lsof +L1
读取文件:
#!/bin/bash
cat filename(待读取的文件) | while read line
do
echo $line
done
查看磁盘读写IO
iostat -d -k -x 1 10
Linux 4.14.0_1-0-0-39 (st01-sys-rpm218.st01.baidu.com) 10/18/2022 _x86_64_ (128 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
nvme2n1 0.00 30.09 8.78 30.08 429.18 1680.19 108.55 0.03 0.50 0.01 0.65 0.04 0.14
nvme1n1 0.00 23.62 52.45 24.89 754.22 1965.41 70.33 0.04 0.40 0.00 1.23 0.04 0.28
nvme3n1 0.00 18.96 6.76 21.99 336.72 1482.33 126.52 0.05 1.58 0.02 2.06 0.05 0.13
nvme0n1 0.00 36.81 105.44 53.69 3340.43 3742.34 89.02 0.07 0.34 0.20 0.60 0.05 0.86
sda 0.00 0.81 0.48 11.12 8.48 208.23 37.37 0.00 0.09 0.06 0.10 0.08 0.09
sdb 3.60 264.40 25.16 89.46 2443.04 9212.97 203.38 0.01 0.49 1.94 0.09 0.83 9.47
sdc 1.13 281.10 14.19 79.42 3038.48 13237.11 347.75 0.05 1.12 2.88 0.81 0.46 4.30
sdd 0.98 223.59 11.87 71.68 2613.12 14645.25 413.16 0.07 1.47 5.77 0.76 1.04 8.72
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
nvme2n1 0.00 12.00 0.00 4.00 0.00 64.00 32.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme1n1 0.00 0.00 78.00 0.00 2488.00 0.00 63.79 0.02 0.00 0.00 0.00 0.04 0.30
nvme3n1 0.00 49.00 0.00 10.00 0.00 480.00 96.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme0n1 0.00 0.00 0.00 6.00 0.00 28.00 9.33 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 0.00 1.00 0.00 8.00 0.00 16.00 0.00 0.00 0.00 0.00 0.00 0.00
sdb 0.00 280.00 0.00 90.00 0.00 1716.00 38.13 0.83 5.78 0.00 5.78 2.60 23.40
sdc 0.00 2.00 0.00 22.00 0.00 96.00 8.73 0.04 1.27 0.00 1.27 0.14 0.30
sdd 0.00 10.00 0.00 5.00 0.00 52.00 20.80 0.05 8.80 0.00 8.80 9.20 4.60
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
nvme2n1 0.00 0.00 0.00 2.00 0.00 8.00 8.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme1n1 0.00 1.00 112.00 2.00 1404.00 12.00 24.84 0.01 0.02 0.02 0.00 0.04 0.40
nvme3n1 0.00 0.00 0.00 4.00 0.00 16.00 8.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme0n1 0.00 0.00 0.00 6.00 0.00 32.00 10.67 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 0.00 0.00 35.00 0.00 280.00 16.00 0.01 0.00 0.00 0.00 0.06 0.20
sdb 0.00 249.00 0.00 56.00 0.00 2180.00 77.86 1.15 24.84 0.00 24.84 5.71 32.00
sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdd 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
nvme2n1 0.00 0.99 0.00 27.72 0.00 467.33 33.71 0.00 0.00 0.00 0.00 0.00 0.00
nvme1n1 0.00 0.00 121.78 0.00 2241.58 0.00 36.81 0.01 0.02 0.02 0.00 0.02 0.30
nvme3n1 0.00 182.18 0.00 437.62 0.00 32582.18 148.90 2.26 4.67 0.00 4.67 0.06 2.48
nvme0n1 0.00 0.00 0.00 10.89 0.00 87.13 16.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 20.79 0.99 100.99 3.96 8736.63 171.42 0.05 0.34 2.00 0.32 0.20 2.08
sdb 0.00 76.24 0.00 322.77 0.00 37295.05 231.09 1.56 3.08 0.00 3.08 0.59 19.11
sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdd 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
nvme2n1 0.00 0.00 0.00 4.00 0.00 16.00 8.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme1n1 0.00 0.00 169.00 0.00 3892.00 0.00 46.06 0.02 0.01 0.01 0.00 0.06 1.00
nvme3n1 0.00 0.00 0.00 8.00 0.00 32.00 8.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme0n1 0.00 133.00 0.00 13.00 0.00 584.00 89.85 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 0.00 0.00 10.00 0.00 64.00 12.80 0.00 0.00 0.00 0.00 0.10 0.10
sdb 0.00 14.00 0.00 150.00 0.00 740.00 9.87 3.63 26.51 0.00 26.51 2.42 36.30
sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdd 0.00 4.00 0.00 30.00 0.00 8860.00 590.67 0.11 2.87 0.00 2.87 0.73 2.20
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
nvme2n1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme1n1 0.00 0.00 109.00 0.00 1736.00 0.00 31.85 0.01 0.00 0.00 0.00 0.04 0.40
nvme3n1 0.00 0.00 0.00 1.00 0.00 4.00 8.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme0n1 0.00 0.00 0.00 6.00 0.00 68.00 22.67 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdb 0.00 0.00 0.00 38.00 0.00 176.00 9.26 0.18 4.24 0.00 4.24 0.89 3.40
sdc 0.00 3.00 0.00 2.00 0.00 20.00 20.00 0.02 12.00 0.00 12.00 12.00 2.40
sdd 0.00 0.00 0.00 2.00 0.00 8.00 8.00 0.00 0.00 0.00 0.00 1.00 0.20
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
nvme2n1 0.00 66.00 0.00 8.00 0.00 296.00 74.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme1n1 0.00 0.00 116.00 0.00 1920.00 0.00 33.10 0.01 0.00 0.00 0.00 0.03 0.30
nvme3n1 0.00 0.00 0.00 9.00 0.00 780.00 173.33 0.00 0.00 0.00 0.00 0.00 0.00
nvme0n1 0.00 0.00 0.00 14.00 0.00 96.00 13.71 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdb 0.00 1.00 0.00 42.00 0.00 444.00 21.14 0.06 1.43 0.00 1.43 1.19 5.00
sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdd 0.00 27.00 0.00 2.00 0.00 116.00 116.00 0.02 8.00 0.00 8.00 8.50 1.70
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
nvme2n1 0.00 0.00 0.00 2.00 0.00 8.00 8.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme1n1 0.00 0.00 291.00 0.00 5548.00 0.00 38.13 0.04 0.00 0.00 0.00 0.05 1.50
nvme3n1 0.00 1.00 0.00 8.00 0.00 36.00 9.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme0n1 0.00 0.00 0.00 10.00 0.00 48.00 9.60 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 0.00 0.00 5.00 0.00 8.00 3.20 0.00 0.00 0.00 0.00 0.20 0.10
sdb 0.00 299.00 0.00 41.00 0.00 1384.00 67.51 0.05 1.10 0.00 1.10 1.05 4.30
sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdd 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
nvme2n1 0.00 57.00 0.00 145.00 0.00 864.00 11.92 0.00 0.00 0.00 0.00 0.00 0.00
nvme1n1 0.00 0.00 157.00 0.00 3420.00 0.00 43.57 0.02 0.00 0.00 0.00 0.04 0.60
nvme3n1 0.00 145.00 0.00 360.00 0.00 42140.00 234.11 3.94 10.64 0.00 10.64 0.09 3.30
nvme0n1 0.00 0.00 0.00 5.00 0.00 36.00 14.40 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdb 0.00 2.00 0.00 50.00 0.00 228.00 9.12 0.10 1.74 0.00 1.74 1.72 8.60
sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdd 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
nvme2n1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme1n1 0.00 0.00 145.00 0.00 2780.00 0.00 38.34 0.01 0.00 0.00 0.00 0.03 0.50
nvme3n1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme0n1 0.00 128.00 0.00 10.00 0.00 552.00 110.40 0.00 0.00 0.00 0.00 0.00 0.00
sda 0.00 0.00 0.00 21.00 0.00 92.00 8.76 0.00 0.00 0.00 0.00 0.00 0.00
sdb 0.00 60.00 0.00 320.00 0.00 20492.00 128.07 0.91 2.29 0.00 2.29 0.36 11.60
sdc 0.00 2.00 0.00 5.00 0.00 28.00 11.20 0.00 0.80 0.00 0.80 0.20 0.10
sdd 0.00 0.00 0.00 1.00 0.00 24.00 48.00 0.00 0.00 0.00 0.00 0.00 0.00
3)iostat输 出项目说明
rrqm/s
将读入请求合并后,每秒发送到设备的读入请求数.
wrqm/s
将写入请求合并后,每秒发送到设备的写入请求数.
r/s
每秒发送到设备的读入请求数.
w/s
每秒发送到设备的写入请求数.
rsec/s
每秒从设备读入的扇区数.
wsec/s
每秒向设备写入的扇区数.
rkB/s
每秒从设备读入的数据量,单位为K.
wkB/s
每秒向设备写入的数据量,单位为K.
avgrq-sz
发送到设备的请求的平均大小,单位是扇区.
avgqu-sz
发送到设备的请求的平均队列长度.
await
I/O请求平均执行时间.包括发送请求和执行的时间.单位是毫秒.
svctm
发送到设备的I/O请求的平均执行时间.单位是毫秒.
%util
在I/O请求发送到设备期间,占用CPU时间的百分比.用于显示设备的带宽利用率.
当这个值接近100%时,表示设备带宽已经占满.
或者用vmstat -d命令
有时候在使用用户登陆Linux系统时会发现,命令行提示符成了:-bash-4.1$,不显示用户名,路径信息。
原因:用户家目录里面与环境变量有关的文件被删除所导致的
也就是这俩文件:
.bash_profile
.bashrc
这两个文件被删除了,导致了这个错误
解决方法:从/etc/skel把丢失的文件 复制回来就可以了
-bash-4.1$ cp /etc/skel/.bash* ~
-bash-4.1$ logout ##复制回来后,登出用户,然后在登陆用户查看是否已经解决
[root@elz-4 ~]# su - erlianzhang
[erlianzhang@elz-4 ~]$
$$
Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
$!
Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号)
$?
最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$-
显示shell使用的当前选项,与set命令功能相同
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$@ 跟$*类似,但是可以当作数组用
$#
添加到Shell的参数个数
$0
Shell本身的文件名
$1~$n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
切割文件:
split -l1000 logfile log.
" < '
JSON中对象的属性名必须是双引号,属性值如果是字符串也必须是双引号
JSON只要涉及到字符串就必须使用双引号,不支持undefined
JSON只要涉及到字符串就必须使用双引号,不支持undefined
链接
ln [选项] 源文件 目标文件
ln -s 要链接的原文件 重命名的文件
选项:
-
-s:建立软链接文件。如果不加 "-s" 选项,则建立硬链接文件;
-
-f:强制。如果目标文件已经存在,则删除目标文件后再建立链接文件;
[root@localhost ~]# touch cangls
[root@localhost ~]# ln /root/cangls /tmp
#建立硬链接文件,目标文件没有写文件名,会和原名一致
#也就是/tmp/cangls 是硬链接文件
[root@localhost ~]# ln /root/cangls /tmp
#建立硬链接文件,目标文件没有写文件名,会和原名一致
#也就是/tmp/cangls 是硬链接文件
sort -r 作用是,sort命令默认的排序方式是升序,如果想改成降序,就需要加上 -r
sort -k4nr 按照第四列 以值的方式 降序排序
time命令常用于测量一个命令的运行时间,注意不是用来显示和修改系统时间的(这是date命令干的事情)
当用到多个 | 通道容易broken pipe 建议存文件然后读文件
moshi=$(cat line.txt | sed 's/,/\n/g' | grep "moshi" | sed 's/:/\n/g' | sed '1d' | sed 's/}//g')
echo输出字符串带‘\n’之类的,用echo -e 输出转义符
shell判断一个字符串是否包含另一个字符串
利用grep查找
strA="long string"
strB="string"
result=$(echo $strA | grep "${strB}")
if [[ "$result" != "" ]]
then
echo "包含"
else
echo "不包含"
fi

浙公网安备 33010602011771号