【Shell】逐行读取并处理文本(文件)
对输入的文本按行读取并进行处理,可使用如下代码:
catdata.dat | while read line do echo"File: ${line}" done while read line do echo"File: ${line}" done< data.dat
以上两种取其一即可,只是第一种由于采用了管道引用更广,可将其他命令的输出作为输入;以上只是简单了进行了echo输出,可采用更复杂的命令进行代替。
如果输入文本每行中没有空格,也可以采用以下两种进行处理,代码如下:
for line in$(catdata.dat) do echo"File: ${line}" done for line in`catdata.dat` do echo"File: ${line}" done
如输入文本行中包括空格,那么会以空格来区分开多个元素,结果就不是按行读取了。
当然如果只是单纯的数据或文本的按行读取和显示的话,使用awk命令会更为方便。
p.s. Csh中逐行读取并处理文本的做法见这里。
*************************************************************************************************************
在shell中,数组变量的复制有两种方法:
(1) name = (value1 ... valuen)此时下标从0开始
(2) name[index] = value
example:
- #1/bin/sh
- #arrayTest
- name=(yunix yhx yfj)
- echo "array is:${name[@]}"
- echo "array length is:${#name[*]}"
- echo ${name[1]}
- name[1]=yang
- echo ${name[1]}
- read -a name
- echo ${name[1]}
- echo "loop the array"
- len=${#name[*]}
- i=0
- while [ $i -lt $len ]
- do
- echo ${name[$i]}
- let i++
- done
result:
array is:yunix yhx yfj
array length is:3
yhx
yang
a b c d e
b
loop the array
a
b
c
d
e
下面的是关于数组的输出实例
example:
- #!/bin/sh
- #arrayLoopOut
- read -a array
- len=${#array[*]}
- echo "array's length is $len"
- echo "use while out the array:"
- i=0
- while [ $i -lt $len ]
- do
- echo -n "${array[$i]}"
- let i++
- done
- echo
- echo "use for out the array:"
- for ((j=0;j<"$len";j=j+1))
- do
- echo -n ${array[$j]}
- done
- echo
- echo "use for in out the array:"
- for value in ${array[*]}
- do
- echo -n $value
- done
result:
a b c d e f g
array's length is 7
use while out the array:
abcdefg
use for out the array:
abcdefg
use for in out the array:
abcdefg
读文件的方法:
第一步: 将文件的内容通过管道(|)或重定向(<)的方式传给while
第二步: while中调用read将文件内容一行一行的读出来,并付值给read后跟随的变量。变量中就保存了当前行中的内容。
例如读取文件/sites/linuxpig.com.txt
1)管道的方式:
cat /sites/linuxpig.com.txt |while read LINE
do
echo $LINE
done
当然也可以将cat /sites/linuxpig.com.txt 写成一些复杂一些的,比如:
示例1:
find -type f -name "*.txt" -exec cat |while read LINE
do
echo $LINE
done
可以将当前目录所有以 .txt 结尾的文件读出
示例2:
grep -r "linuxpig.com" ./ | awk -F":" '{print $1}' | cat |while read LINE
do
echo $LINE
done
可以将含有 "linuxpig.com" 字符串的所有文件打开并读取。。
示例没有实际测试,如果使用请先测试。。。。。:-)
2)重定向的方式:
2.1 利用重定向符<
while read LINE
do
echo $LINE
done < /sites/linuxpig.com.txt
2.2 利用文件描述符(0~9)和重定向符 <
exec 3<&0
exec 0</sites/linuxpig.com.txt
while read LINE
do
echo $LINE
done
exec 0<&3
*************************************************************************************************************
linux中的shell脚本创建文件夹,若文件夹存在,则删除重新创建,若不存在,直接创建
************************************************************************************************************
linux shell的一些技巧(五)exec与文件描述符
|字号 订阅
*****************************************************************************
标准输出
标准输出是文件描述符1.它是命令的输出,缺省是屏幕,也可以是文件
标准错误
标准错误是文件件描述符2。它是命令错误码率的输出,缺省是屏幕,同样也可以是文件.
重定向操作符 描述
> 将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或句柄。
< 从文件而不是从键盘或句柄读入命令输入。
>> 将命令输出添加到文件末尾而不删除文件中已有的信息。
>& 将一个句柄的输出写入到另一个句柄的输入中。
<& 从一个句柄读取输入并将其写入到另一个句柄输出中。
| 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。
常用文件重定向命令
- command > filename 把标准输出重定向到一个新文件中
- command >> filename 把标准输出重定向到一个文件中(追加)
- command 1 > fielname 把标准输出重定向到一个文件中
- command > filename 2>&1 把标准输出和标准错误一起重定向到一个文件中
- command 2 > filename 把标准错误重定向到一个文件中
- command 2 >> filename 把标准输出重定向到一个文件中(追加)
- command >> filename 2>&1 把标准输出和标准错误一起重定向到一个文件中(追加)
- command < filename >filename2 把command命令以filename文件作为标准输入,以filename文件作为标准输出
- command < filename 把command命令以filename文件作为标准输入
- command << delimiter 把从标准输入中读入,直至遇到d e l i m i t e r分界符
- command <&m 把把文件描述符m作为标准输入
- command >&m 把把标准输出重定向到文件描述符m中
*********************************************************************************************
Linux shell下查看文件/文件夹大小的命令
Linux shell下查看文件/文件夹大小的命令是"du",如下
# du -s -h filename
选项"-s":如果输入为文件夹,表示文件夹总共的大小,如果是文件,则不起作用。
选项"-h":表示human readable,显示人可读的单位KB, MB, GB。
至于"du"命令的其它选项查手册就可以了。
********************************************************************************************
linux shell 脚本实现tcp/upd协议通讯(重定向应用)
三、通过shell脚本重定向实现监控memcache状态
/***********************************实例:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162#!/bin/sh
#通过传入ip 以及端口,发送指令获得返回数据
#copyright chengmo qq:8292669
#函数往往放到最上面
function
sendmsg()
{
msg=$1;
echo
"$1"
>&8;
getout;
}
#向socket通道发送指令,并且调用获得返回参数
function
getout()
{
#read 命令 -u 从打开文件描述符 8 读取数据,-d读取数据忽略掉:\r换行符
while
read
-u 8 -d $
'\r'
name;
do
if
[
"${name}"
==
"END"
-o
"${name}"
==
"ERROR"
];
then
break
;
fi
;
echo
$name;
done
}
#由于:memcached每次通讯完毕,会返回:END或者ERROR(出错),通过判断是否是"END"觉得读取是不是结束,否则循环不会停止
if
[ $
# -lt 2 ];then
echo
"usage:$0 host port [command]"
;
exit
1;
fi
;
[[ $
# -gt 2 ]]&&command=$3;
#设置默认值 如果command为定义则为:stats
command
=
"${command=stats}"
;
host=
"$1"
;
port=
"$2"
;
exec
8<>
/dev/tcp/
${host}/${port};
#打开通向通道是8
if
[
"$?"
!=
"0"
];
then
echo
"open $host $port fail!"
;
exit
1;
fi
sendmsg
"$command"
;
#发送指定命令
sendmsg
"quit"
;
#发送退出通向命令
exec
8<&-;
exec
8>&-;
#关闭socket通道
exit
0;
这是通过重定向,实现socket通讯中,发送然后获取返回的例子。其实,上面代码看似一次只能发送一段。时间上。我们可以反复调用:sendmsg ,捕捉输出数据。实现连续的,读与写操作。
实例截图:
其它实现方法:
其实通过:telnet也可以实现的。
[chengmo@centos5 shell]$ (echo "stats";sleep 2)|telnet 127.0.0.1 11211
通过nc命令实现:
[chengmo@centos5 shell]$ (echo "stats")|nc 127.0.0.1 11211
不需要加延迟,直接打开通道
Shell Scripts
./serversocket (ip:192.168.1.123 port:8090)
exec 8<>/dev/tcp/192.168.1.123/8090;echo "abc">&8
netstat |grep 8090
************************************/