Shell 脚本练习

上一篇 / 下一篇  2013-10-07 17:12:22 / 个人分类:Shell学习

1、awk 'BEGIN {print "abin  haha\n============================="}{print $1}END{print "end-if-file"}' cal.txt
2、sed 's/123/456/g' file.txt > file.txt.new 修改的保存到其它文件
   sed -i '1,5d' 删除1到5行
3、sed -i 's/123/456/g' file.txt 直接修改原文件
4、sed -i 's/\/usr\/local\/apache2\/htdocs/\/var\/www\/html/g' /usr/local/apache2/conf/httpd.conf
5、sed -i 's/DirectoryIndex index.html index.html.var/& index.htm index.php /g' /usr/local/apache2/conf/httpd.conf
5、sed 's/export PATH=.*$/&:\/opt\/VRTSvcs\/bin/' .profile 带有“export PATH”的行替换为原内容加/opt/VRTSvcs/bin。
   sed -n '3,$p' 从第三行开始显示
6、awk '{if( NR>0 && $3~/17/)print $0}END{print FILENAME}' cal.txt       NF NR FILENAME
7、pwd&&echo $PWD|awk -F/ '{print $NF}'或者pwd|echo $PWD|awk -F/ '{print $NF}'
8、sed -n '/dd/Ip' 查询包含dd字符串的行,不区分大小写。
9,echo "abad123 ssd"|sed 's/\([a-z].\).* \([a-z]\).*/\2/'
10、echo "abad123 ssd"|sed 's/\([a-z].\).* \([a-z]\).*/\1/'
11、grep -o -e "datastore-[0-9]" 查询文件中匹配的字符串。
12、sed 's#.*/\([^.]*\).*#\1#'
13、shell中取字符串:
 IFMAC=$(< ./inst-mac)
 
8、每一行开头加  cat renewlist.txt | awk '{ print "/usr/local/USM"$0}'
echo /sys/class/net/eth0|cut -b 16-
eth0
echo /sys/class/net/eth0|cut -b -16
/sys/class/net/e
8、cut -d: -f1 /etc/passwd 
function die () {
    [ -n "$@" ] && echo "$@"  |tee -a $log
    echo "ATAE $PROMPT_STRING failed."
    exit 1
}

if [ ! -f /opt/dms/bin/atae_version ] && [ -f /opt/dms/bin/dmsserver ];then
               die "An earlier version of ATAE has been installed in this system, please uninstall it first."
        fi
读取某一行:
sed -n '29p' menu.lst
awk -F '' 可以使用 NULL 为分隔符。
awk -F''  不能使用 NULL 为分隔符。起引号内必须赋值. 
lspci |grep "Fibre Channel" |awk -F'Channel:' '{print$2}' |head -n 1| tail -n 1 |awk '{print$1}'

打印日志和正常退出。
function die () {
                echo "$@"  |tee -a $logFile
                        exit 1
}
function log () {
                echo "$@"  |tee -a $logFile
}

 
 
浮点运算:
#! /bin/bash
 
a=1.2
b=1.3
c=$(echo "$a+$b"|bc)    #加法运算
d=$(echo "$a*$b"|bc)    #乘积运算
e=$(echo "scale=5;$a/$b"|bc)    #除法运算,scale=5为指定小数位数为5位
echo "$c $d $e"
 
echo "s(1)"|bc -l    #计算sin(1),-l选项为调用数学库
 
#计算0.5+0.5^2+...+0.5^5
s=0
for i in 1 2 3 4 5
do
    s=$(echo "$s+0.5^$i"|bc -l)
done
echo $s

删除重复行:
awk '{if ($0!=line) print;line=$0}' ab
awk '!a[$0]++' ab

更改内核:

set -x
#sed 's|default 1|default 0|' menu.lst > menu.lst.tmp
addkdump="kernel /boot/xen.gz cpuidle=0 dom0_mem=2G mce=0crashkernel=256M@128M"
sed "s|kernel \/boot\/xen.gz|$addkdump|" menu.lst > menu.lst.tmp
cat menu.lst.tmp
sed 's|default 1|default 0|' menu.lst.tmp > menu.lst.tmp1
cat menu.lst.tmp1
mv menu.lst.tmp1 menu.lst
[ -f menu.lst.tmp ]&&rm menu.lst.tmp
set +x
 
去掉输出的字符串的空格
sed 's/ //g'
sed '/elevator=noop/!s/root=.*/& elevator=noop/' /boot/grub/menu.lst > /boot/grub/menu.lst.tmp
[ ${#fdsdf} = 12 ]字符串长度=12
[ "X$agentserver" = "X" ] || PSOIP=$agentserver 避免$agentserver是空字符串
编辑到文件ab。
"
sed -e 's/^ //g' << " EOF" >>ab
 
  echo "It a file ab"
"
 
error() {
    touch "$work_dir/error"
    oops "$@"
}
oops() {
    echo "$2" >&2
    cleanup
    exit_code=$1
    exit $1
}
if [ $exit_code -eq 0 -a "$(readlink ${kernel_image%%-*})" = \
         "${kernel_image#$boot_dir/}" -a \
         "${initrd_image#$boot_dir/initrd-}" = \
         "${kernel_image#$boot_dir/vmlinu[xz]-}" ]; then
        rm -f $root_dir/$boot_dir/initrd
        ln -s "${initrd_image#$boot_dir/}" $root_dir/$boot_dir/initrd
fi
 
 
 

用这个命令可能更好
sed -e "s/@@.*//g" a.txt > b.txt
如果直接在a.txt直接改的话 加个-i参数
sed -i -e "s/@@.*//g" a.txt

echo 2>&1 "Don't refresh the bootloader. You may have to do " \
                  "that manually!"
/sbin/ifconfig bond0 | grep -o "inet addr:[ ]*[^ ]*" | cut -d ':' -f 2
 
find -L "$DIR" -regextype posix-egrep -regex "$FILEREG" ! -type d | xargs --no-run-if-empty ls -tr | tail -n $MAXFILE |
   while read filename
   do
      do_zip "$filename"
   done
 
find -L "$DIR" -name "$FILENAME" ! -type d | sort |
   while read filename
   do
      do_zip "$filename"
   done

if chkconfig  vmware-rbd-watchdog  | grep -q off ; then
   # Make sure we don't start the service, but register the hostname/port
   # changes.
   SERVICE_DISABLED=1
fi

  useradd -m -d /home/$sshuser $sshuser
  {
      sleep 1
      echo $sshpasswd
      sleep 1
      echo $sshpasswd
  } | passwd $sshuser
  {
      sleep 1
      echo $rootpasswd
      sleep 1
      echo $rootpasswd
  } | passwd

更改密码,将david的密码改为123456
echo "123456"|passwd --stdin david

===============================================
print0的妙用
===============================================
david% touch "foo bar"  
david% find | xargs ls  
ls: ./foo: No such file or directory  
ls: bar: No such file or directory  
david% find -print0 | xargs -0 ls  
./foo bar
=================================================
i=0
for (( ;i<"$devnum";i++ ))
do
done
==============================================================================================
sed -i '/<Bills>/a \<Bill\> \
                            \<Type\>ics.ebs\<\/Type\> \
                            \<DirName\>\/home\/c3\/bill\/cloudservice\/ics\<\/DirName\> \
                            \<NameFormat\>ics-stock-ebs-%s-%s-%04d.csv\<\/NameFormat\> \
                            \<MaxBillLen\>2048\<\/MaxBillLen\> \
                            \<MaxBillTime\>600\<\/MaxBillTime\> \
                            \<BillTimeType\>yyyyMMddHHmmss\<\/BillTimeType\> \
\<\/Bill\>' $bill_config_file
 
1、将比较 file1的1-4字符 和 file2的2-5 字符,如果相同,将file2 的第二列 与 file1 合并
awk  'NR==FNR{a[substr($1,2,5)]=$2}NR>FNR&&a[b=substr($1,1,4)]{print $0, a[b]}' a b
2、sed '101,$ s/A/a/' 从101行到最后一行处理 替换A
3、合并b,a文件,如果b中有一个字段为空 则用NULL替代
awk 'NR==FNR{a[i]=$0;i++}NR>FNR{if(a[j]==""){print "NULL          "$0}else{print a[j]" "$0};j++}' b a
4、合并两个文件:
awk 'NR==FNR{a[i]=$0;i++}NR>FNR{print a[j]" "$0;j++}' file1 file2 >file3

   awk 'NR==FNR{a[FNR]=$0;}NR>FNR{print a[FNR]" "$0;}' file1 file2 >file3
5、awk调用shell外部函数:
export -f getmacinfo
                awk -v vi="$vi" -v vs="$hostid_ip $vmstate" 'BEGIN{while("getmacinfo '"$vd"'"|getline d){print vi,d,vs}}'
6、关联数组关联多个字段:
awk 'NR==FNR{a[$3]=$1" "$2}NR>FNR&&b=$6{print $0,a[b]}' b a
7、查找vc.info上有db.info上没有的:awk 'NR==FNR{a[$3]++}NR>FNR&&a[$1]!=1{print $1}' db.info vc.info
8、打印第一行就退出(对处理大文件十分有效)。
sed -n '1p;1q' file
9、将第七列按行打印:
awk '{ORS=" ";print $7}'或者awk '{print $7}'|xargs
10、读取文件内容到数组:
OLDIFS=$IFS  IFS=$'\n'
fileArray=($(cat file.txt))
11、sed的标签功能(t)
(1)b.txt文件有1则在行末置 Yes, 否则置No.
sed '/1/s/$/ Yes/;t;s/$/ No/' b.txt
(2)如果postgresql存在行首为“POSTGRES_DATADIR=”则将其替换为PGDATA=并打印出修改的行。
sed -n '/^POSTGRES_DATADIR=/s//PGDATA=/p' postgresql
12、一个变量的值作为另一个变量的名${!varname},间接扩充或间接引用。
#a=b;b=c;echo ${!a}
c
#a=b;b=c;eval echo \$$a

13、$*保存以$IFS指定分割符所分割的字符数组;$@原样的保存参数列表,$1,$2,$3...
 
14、查询所有的进程打开的文件个数,以及所有的进程数。
lsof|awk 'BEGIN{printf"NAME   PID    NUM\n======================\n"}{++S[$1" "$2];++i} END {for(a in S) printf "%6s" "%7s\n",a, S[a];print "=======================\nThe total pid is "i}'
 
15、xargs的妙用:
1)、拷贝当前的文件到目录/tmp/abin/类似于cp -v * /tmp/abin/
ls . |xargs -i -t cp ./{} /tmp/abin/
--参数解释:-i是替换字符串的选项,{}是输出文本的替换点。
-t是将输出命令行到stderr
2)、find于tar联合使用
find -name "hah*" -type f -print0|xargs -0 tar -zcf haha.tar.gz

TAG:

abinNO1的个人空间 引用 删除 abinNO1   /   2020-05-06 12:52:48
时间戳互转;
date -d "2020-05-06 12:43:22" +%s
date -d @1588740202  "+%Y-%m-%d %H:%M:%S"
abinNO1的个人空间 引用 删除 abinNO1   /   2016-01-13 14:47:07
1、匹配两个字符串中间的数据:
贪婪模式:
egrep -o "<ZCLAS>([^<]*)</ZCLAS><ZOBJNR>([^<]*)</ZOBJNR>"     temp.xml

非贪婪模式:
egrep -o "<Z CLAS>([^<]*?)</ZCLAS><ZOBJNR>([^<]*?</ZOBJNR>"  temp.xml
abinNO1的个人空间 引用 删除 abinNO1   /   2015-11-06 10:03:52
打印文件末尾往上数的第一个空行
awk '$0 !~/^$/{a=$0;}END{if($0 ~/^$/) print a}'  file
abinNO1的个人空间 引用 删除 abinNO1   /   2015-11-06 09:46:13
sed 往首行插入数据---前提文件非空至少有结束字符。

sed -i '1,$i\filecontent haha
abinNO1的个人空间 引用 删除 abinNO1   /   2015-11-05 18:48:25
cat >filename <<EOF
asdds
aa
EOF
abinNO1的个人空间 引用 删除 abinNO1   /   2015-09-17 10:31:23
1、该脚本的工作原理很简单:替代规则表达式与一行的最末字符匹配,而该字符恰好就是回车。我们用空字符替换它,从而将其从输出中彻底删除。类似dos2unix
sed -e 's/.$//' mydos.txt > myunix.txt
windows和UNIX格式混合的文件,变得都是unix格式的
sed -e 's/\r//g' window.txt  > unix.txt
2、在该脚本中,'$' 规则表达式将与行的末尾匹配,而 '/r' 告诉 sed 在其之前插入一个回车。在换行之前插入回车,立即,每一行就以 CR/LF 结束
sed -e 's/$/\r/' myunix.txt > mydos.txt

dos,unix格式处理的差别:DOS是回车+换行,而在UNIX下,只有回车,无换行!
abinNO1的个人空间 引用 删除 abinNO1   /   2014-03-24 23:41:11
1、捕捉Ctrl + c
trap 'echo "passwd: System error";exit' 2;
 

评分:0

我来说两句

Open Toolbar