PT组点滴记忆

来源:互联网 发布:淘宝网汽车坐垫套 编辑:程序博客网 时间:2024/06/11 02:17

1:工程师首先想到的是解决问题,而不是学习知识。
工程师解决问题的方式:
   那次SPEC编译失败,是因为你禁用了二进制接口宏;
   这次/var目录空间不足的解决方法:背景(你明明删除了LOG子目录下的messages文件,但还是显示/VAR/目录剩余空间为0)
  方法:仅仅重启一下/ETC/INIT.D/SYSLOG服务就行了,根本不用再上网搜什么资料。

2 转义字符方面的东西

\s在很多流派里面都代表空白,包括tab,空格,换行,回车这类的。其他的还有:

\t:tab
\n:换行
\r:回车
\S:除了\s以外所有的字符(所以\s\S就是统统统统的有了)
\w:[a-zA-Z0-9]
\W:\w以外所有的字符
\d:0-9数字
\D:除了\d以外的字符
5.修饰符:i是忽略大小写

一次我们想试一下能不能用cat命令来显示man的内容,我们用如下命令将bash的帮助页写到文件kkk中去:
man -P /bin/cat bash >kkk
结果发现,用cat命令显示kkk 文件时一切正常,而用vi命令编辑此文件时却发现行中夹杂着许多乱字符,就像下面这样:
 N^HNA^HAM^HME^HE
       bash - GNU Bourne-Again SHell
S^HSY^HYN^HNO^HOP^HPS^HSI^HIS^HS
这些夹杂在行中的^H实际上是退格键,也就是说有些行每输入一个字符,就用退格键将其删除,然后重新输入这个字符。对于cat命令来说,能够正确解释退格键这样的控制字符,所以其显示结果看不出什么不正常,然而vi命令就无法正常显示了,此外当使用grep命令时也不能正常查找。解决的办法是使用如下sed命令:
sed 's/.\x8//g' kkk >kkk1
这样就将文件kkk中的乱字符去掉并将正确的内容送到文件kkk1中去了。
3:sed语法及正则表达式学习

见mod_elilo()中:
eliloconf='/boot/efi/efi/redhat/elilo.conf'
default=`awk -F '=' '$1~/^default/{print $2}' $eliloconf`
label_n=`grep -n "^[[:blank:]]label=${default}$" $eliloconf | awk -F ':' '{print $1}'`
sed "${label_n},$((${label_n}+3))s%\(^[[:blank:]]append=\"\).*\$%\1${append}\"%" $eliloconf


见mod_str()中:
str_before=`sed <<< "$str_before" "s@/@\\\\\\\\/@g"`
可用命令检验: str_before=`sed <<< "/bin/bash/" "s@/@\\\\\\\\/@g"`;echo $str_before
结果则为:\/bin\/bash\/
如果命令为:sed <<< "$str_before" "s@/@\\\\/@g"
则为:\/bin\/bash\/

ed-最古老的编辑器
 str_after=`sed <<< "$str_after" "s@/@\\\\\\\\/@g"`
    ed - $mod_file <<- EOF
 %s/$str_before/$str_after/
 w
 EOF

4:富士通两备脚本学习

/etc/opt/fjsvdrivers/mkinitrd/S10sdx_mkinitrd:

如果image为initrd,
IMAGE=`echo $image | sed -r -e "s#^([^/])#$PWD/\1#"`
中IMAGE为:`pwd`/initrd

rootdev=$(awk '/^[ \t]*[^#]/ { if ($2 == "/") { print $1; }}' $fstab)
中间\t为空格及制表符。

echo $rootdev | cut -d/ -f1,2,3`
如果rootdev为/dev/sfdsk/RootClassX/dsk/rootVolume
则结果为
/dev/sfdsk

for t in /tmp /var/tmp /root ${PWD}; do
  if [ ! -d $t ]; then continue; fi
  if ! echo access -w $t | /sbin/nash --quiet; then continue; fi
  fs=$(df -T $t 2>/dev/null | awk '{line=$1;} END {printf $2;}')
  if [ "$fs" != "tmpfs" ]; then
   TMPDIR=$t
   break
  fi
 done
中间continue的用法,

update_init() {

 mknod_cmds=`mknod_command` \
  || error "Could not construct mknod statements."
及:
mknod_command() {
 [ -d "/dev/sfdsk/${root_class}/dsk" ] \
  || error "/dev/sfdsk/$root_class/dsk: No such directory."
 ls -ln /dev/sfdsk/${root_class}/dsk | awk "
 BEGIN {
  FS=\",[ \t]*|[ \t]+\"
  printf \"mkdir -p /dev/sfdsk\\\\n\"
  printf \"mkdir -p /dev/sfdsk/${root_class}\\\\n\"
  printf \"mkdir -p /dev/sfdsk/${root_class}/dsk\\\\n\"
 }
 !/^total/ && /^b/ {
 printf \"mknod /dev/sfdsk/${root_class}/dsk/\" \$NF \" b \" \$5 \" \" \$6 \"\\\\n\"
 }"   
}
中间:FS=\",[ \t]*|[ \t]+\"  FS可设置多个分隔符,
执行echo -en $mknod_cmds结果为:
mkdir -p /dev/sfdsk
mkdir -p /dev/sfdsk/RootClassX
mkdir -p /dev/sfdsk/RootClassX/dsk
mknod /dev/sfdsk/RootClassX/dsk/ahVolume b 231 34
mknod /dev/sfdsk/RootClassX/dsk/efiVolume b 231 6
mknod /dev/sfdsk/RootClassX/dsk/optVolume b 231 33
mknod /dev/sfdsk/RootClassX/dsk/rootVolume b 231 2
mknod /dev/sfdsk/RootClassX/dsk/swapVolume b 231 32
mknod /dev/sfdsk/RootClassX/dsk/varVolume b 231 4
单执行函数mknod_command里的语句结果为:
mkdir -p /dev/sfdsk\nmkdir -p /dev/sfdsk/RootClassX\nmkdir -p /dev/sfdsk/RootClassX/dsk\nmknod /dev/sfdsk/RootClassX/dsk/ahVolume b 231 34\n等等;
单独的NF代表当前行字段的个数;


cat >> $work_init << EOL
echo "Loading sfdsk"
insmod /lib/sfdsk_lib
insmod /lib/sfdsksys
EOL
中间CAT命令的用法,现场往文件里面输东西;


awk -f - init >> $work_init << EOS
NR > $pos_1 {
 if (/^resume/ || /^mkrootdev/){
  print
 }else if (!/sfdsk/){
  print
 }
 if (/switchroot/) exit
}
EOS
AWK的参数f表明它的动作命令是
NR > $pos_1 {
 if (/^resume/ || /^mkrootdev/){
  print
 }else if (!/sfdsk/){
  print
 }
 if (/switchroot/) exit
}