shell 常用命令

find ./ -name *.conf -print |xargs grep "P_DM_T"
${varname:-word} #当varname为空时,返回word
${varname:word} #当varname为空时,设置为word
${varname:?message}#当varname为空时,打印message
${varname:+word} #当varname为空时,返回null,否则返回word

${varname#pattern} #如果匹配变量的开头,则删除匹配的最短部分。
path=/home/prince/desktop/long.file.home
x=${path#/*/} 删除匹配的最短部分。
echo $x
prince/desktop/long.file.home

${varname##pattern} 删除匹配的最长部分。
x=${path##/*/}
echo $x
long.file.home

${varname%pattern} 删除结尾匹配的最短部分。
x=${path%.*}
echo $x
/home/prince/desktop/long.file

${varname%%pattern} 删除结尾匹配的最长部分。
x=${path%%.*}
echo $x
/home/prince/desktop/long

${varname/pattern/string} 匹配的第一部分替换为string
x=${path/prince/ollir} #prince 替换为ollir
echo $x
/home/ollir/desktop/long.file.home

${varname//pattern/string} 所有匹配部分替换为string
x=${path//home/myhome}
echo $x
/myhome/prince/desktop/long.file.myhome

/*/ 匹配两个斜杠之间的内容。
.* 匹配点后面的内容。


PATH路径是用:分割的。现在换成回车。
echo ${PATH//:/'\n'}-e #PATH路径行转列。
或者使用:
echo $PATH |sed 's/:/\n/g' 全局替换为回车。

#line="arg=123"
echo ${line%\=*} #截取变量。arg
echo ${arg#\*=} #截取值:123

${#varname} #varname中字符个数。

$0 #当前执行的shell
$$ #当前shell的进程号。
$? #上次命令的返回值。0表示成功。
$# #参数个数。
$n #第几个参数。
$@ #所有的参数。
$* #所有的参数。

if [ $#-ne 2 ] ; #参数个数不等于2.
then
exit 1;
fi

if [ $?-ne 0 ]; #上次命令返回值不是0,即不成功
then
exit 1;
fi

shift:命令截去参数列表中最左边一个参数。

#type 命令名称:查看命令的类型:如:别名,函数,外部命令。
type ls

函数中;exit退出脚本。return 返回调用它的地方。return返回函数的执行最后一次命令的退出状态。
source 或则dot 命令载入写入其他脚本的函数。

function fname(){}
function fname {}
fname(){} 创建函数的方法。

unset-f fname; 删除函数。

function user_login()
{
if who |grep $1 >/dev/null
then
echo "user $1 is on"
fi
}

source user_login.sh
user_login root root用户是否登录。

return n : n的取值范围为:0~255

-n str1 #str1非空。
-z str1 #str1为空。

if [ $# -lt 2 -o !-e "$1"] 参数个数小于2或者:不存在 $1
then
exit
fi

test -b file #判断是否是块设备文件。
test -c file #判断是否为字符设备文件
test -d file #判断是否为目录
test -e file #判断存在。
test -f file #判断为一般文件。
---test -g file #
test -h file #判断文件为符号链接。
test -p file #file为管道。
test -r file #file可读。
test -S file #file套接字
test -s file #file非空
test -w file #file可写
test -x file #file可执行
test file1 -nt file2 #file1比file2新。
test file1 -ot file2 #file1比file2旧
if [ -r file ] && [ -w file ] && [ -x file ] #判断文件同时可读可写可执行。
then
null;
fi

while/until condition #while条件为真时执行,until条件为真时不执行。
do
statement
done

\b 是正则表达式规定的一个特殊代码,代表着单词的开头或结尾。
\bhi\b #匹配文本中的 hi
\bhi\b.*\bLucy\b #hi 的后面不远处有Lucy,不换行。
0\d\d-\d\d\d\d\d\d\d\d #\d匹配(0~9),这个就是电话号码。
0\d{2}-\d{8} #数字重复两次-数字重复8次,匹配电话号码。

元字符;
^ #字符串的开始。
$ #字符串的结束。
. #匹配一个非换行符的字符。
* #匹配0个或多个先前字符。
[...] #匹配方括号内任意一个字符。
\ #用于打开或关闭后续字符的特殊含义。如: \(\)
\(\) #将模式存储在保留空间中,在后续的正则表达式中可以通过转义序列引用这些匹配的模式。
\n #转义序列 n为1~9
x\{m,n\} #x至少出现m次,最多出现n次。
x{m,n} #x至少出现m次,最多出现n次。
+ #匹配正则表达式的一个或多个实例。
? 匹配正则表达式的0个或1个实例。
| #匹配前面或后面的正则表达式。
() #匹配用括号括起来的正则表达式群。

meta 字符:
\< :匹配单词的开始:'\<grep' 匹配以grep开头的行。
\> :匹配单词的介绍:'grep\>' 匹配以grep结束的行。
\w :匹配文字和数字字符。[A-Za-z0-9],'G\w*p' G后跟多个文字或数字字符,然后是p
\W :匹配一个或多个非单词字符如:,。
\b:单词锁定符。

ls -l |grep '^a' 以a开头的行。
grep 'test' d* 所有以d开头的文件中匹配test的行。
grep 'test' aa bb cc 这三个文件中匹配test的行。
grep '[a-z]\{5\}' 有连续5个小写字母的行。
grep 'w\(es\)t.*\1' 找匹配:'west.*es' 的行。
egrep/grep-E w(es)t.*\1 或者这种写法也是可以的。


字符集;
[[:alnum:]] 匹配文字数字字符,等效于[A-Za-z0-9]
[[:alpha:]] 匹配文字字符。
[[:blank:]] 匹配空格和tab定位字符。
[[:digit:]] 数字字符。
[[:graph:]] 非空字符。
[[:lower:]] 小写字符。
[[:cntrl:]] 控制字符。如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、
BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等。
[[:print:]] 非空字符(包括空格)
[[:punct:]] 标点符号
[[:space:]] 所有空白字符(新行,空格,制表符)
[[:upper:]] 大写字符。
[[:xdigit:]] 十六进制数据(0-9,a-f,A-F)
正则表达式允许POSIX字符集与其他字符集混用。[[:alpha:]!] 匹配任意一个英文字母或感叹号。
[[:digit:]_]+ 正则表达式匹配一个或多个数字字符或下划线(_)
[^abc] 除了abc的其他字符。
[[.ing.][.in.]] 匹配ing或者in
在方括号中,所有的meta字符都会失去其含义[\.] 匹配\和.
*字符匹配零个或多个星号前面的字符。ab*c 匹配ac,abc,abbc 等。

区间表达式:
ab\{3\}c b重现3次。
ab\{3,\}c b至少重现3次。
ab\{3,5\}c b重现3到5次。

在ERE中:上面的可以写为:
ab{3}c
ab{3,}c
ab{3,5}c

ERE中:
?匹配0个或一个前置正则表达式。
+匹配1个或多个前置正则表达式。
^$ 表示空行。
^[[:alpha:]]\{3\} 开头三个字符。

\(\)\n 反向应用表达式。

后向引用。
\(ab\)\(cd\)[efg]*\1\2 匹配:abcdabcd abcdeabcd abcdfabcd abcdgabcd
\(go\).*\1 匹配一行中前后出现两个go

ERE:
交替:交替是在不同序列之间用管道符号隔开。you|me 匹配you或者me

分组:
(Lily|Lucy)will visit my house today;

man|woman+ 匹配:man,woman,womann ,womannn....这里是woman后面的n重复。
(man|woman)+ 匹配:man,woman,manman,womanwoman 一个或多个man或woman的连接,

grep和sed支持的正则表达式是BER
egrep和awk支持的正则表达式是ERE.
echo 'this is a word.' |grep "\<word\>" 匹配单词word
echo 'these are words.'|grep "\<word" 匹配单词以word开头,还有还有其他字符。

posted @ 2020-01-20 14:33  戒掉贪嗔痴  阅读(172)  评论(0编辑  收藏  举报