下面是小编整理的shell下同时读取多个文件的方法(共含8篇),欢迎大家阅读分享借鉴,希望对大家有所帮助。同时,但愿您也能像本文投稿人“王老吉”一样,积极向本站投稿分享好文章。
1. 单个文件的读取
在shell脚本下,可以多种方式实现按行读取文件,如下:
for line in `cat ${input_filename}`
do
echo $line
done
while read line
do
echo $line
done < ${input_filename}
其中第二种方式是将文件重定向到标准输入中
2. 多个文件读取方法
那如何实现同时多个文件的读呢?
我们可以继续利用bash中的文件重定向功能,将文件重定向到特定的文件描述符中,语法如下:
n
n>file
n>>file
nfile
这里的n代表打开文件file的文件描述符,类似其他编程语言中的fd,如果没有指定n,则其默认行为如下:
>file #same as 1>file
file #same as 0file
我们可以通过exec命令来打开所要重定向的文件:
exec 7
exec 8
然后我们可以通过read命令来读取对应文件的内容:
read data <&7 #使用符合是为了区分7是文件描述符,而不是文件名
read data <&8
关闭文件
exec 7
exec 8
多文件读取示例代码如下:
readfiles {
local FD1=7
local FD2=8
local file1=$1
local file2=$2
local count1=0
local count2=0
local eof1=0
local eof2=0
local data1
local data2
# Open files.
exec 7<$file1
exec 8<$file2
while [[ $eof1 -eq 0 || $eof2 -eq 0 ]]
do
if read data1<&$FD1; then
let count1++
printf “%s, line %d: %s\n” $file1 $count1 “$data1”
else
eof1=1
fi
if read data2 <&$FD2; then
let count2++
printf “%s, line %d: %s\n” $file2 $count2 “$data2”
else
eof2=1
fi
done
}
#read file1 and file2
readfiles file1 file2
这个技巧比较简单,相信很多朋友都会,在此,献丑一下,谨希望能给使用Windows 7 的新手朋友们一点点小帮助,高手勿笑,
举个例子,大家从相机里导出的照片都是以“数字”为文件名,很多朋友会想重新批量重新命名一下,例如“香港迪斯尼001、香港迪斯尼002”等等,
在Windows7下,批量重命名其实也只需要一键:
将多个文件选中,按“Ctrl+A”或按住”Ctrl”然后用鼠标点击想修改的文件,选中后按“F2”或者在选中的文件上右键“重命名”即可,各个文件结尾将以“(数字).jpg”的形式区分。
希望小技巧,能帮助新手朋友们。
作者:vpsee 字体:[增加 减小] 类型:
这篇文章主要介绍了Shell脚本逐行读取文本文件,本文着重探讨不改变文本格式的方法读取出文件内容,需要的朋友可以参考下
网上有很多 shell script. 读文本文件的例子,但是都没有讲出故事的全部,只说了一半,举个例子,比如从一个 testfile 文件中读取如下格式的文本行:
代码如下:
$ vi testfile
ls -a -l /bin | sort
ls -a -l /bin | sort | wc
ls -a -l | grep sh | wc
ls -a -l
ls -a -l | sort | wc
最常见的一个 line by line 读取文件内容的例子就是:
代码如下:
$ vi readfile
#!/bin/sh
testfile=$1
while read -r line
do
echo $line
done < $testfile
$ chmod +x readfile
$ ./readfile testfile
ls -a -l /bin | sort
ls -a -l /bin | sort | wc
ls -a -l | grep sh | wc
ls -a -l
ls -a -l | sort | wc
这个例子的问题是读取文本行后,文本格式发生了变化,和原来 testfile 文件的内容不完全一致,空格字符自动被删除了一些。为什么会这样呢?因为 IFS,如果在 shell script. 里没有明确指定 IFS 的话,IFS 会默认用来分割空格、制表、换行等,所以上面文本行里多余的空格和换行都被自动缩进了。
如果想要输出 testfile 文件原有的格式,把每行(作为整体)原封不动的打印出来怎么办?这时需要指定 IFS 变量,告诉 shell 以 ”行“ 为单位读取,
代码如下:
$ vi readfile
#!/bin/sh
IFS=”“
testfile=$1
while read -r line
do
echo $line
done < $testfile
$ ./readfile testfile
ls -a -l /bin | sort
ls -a -l /bin | sort | wc
ls -a -l | grep sh | wc
ls -a -l
ls -a -l | sort | wc
上面两种方法的输出不是差不多吗,有什么关系呢,第一种还美观一些?关系重大,VPSee 昨天写了一个模拟 shell 的 C 程序,然后又写了一个 shell script. 来测试这个 C 程序,这个 script. 需要从上面的 testfile 里读取完整一行传给 C 程序,如果按照上面的两种方法会得到两种不同的输入格式,意义完全不同:
代码如下:
$./mypipe ls -a -l | sort | wc
$./mypipe ”ls -a -l | sort | wc “
显然我要的是第2种输入,把 ”ls -a -l | sort | wc “ 作为整体传给我的 mypipe,来测试我的 mypipe 能不能正确识别出字符串里面的各种命令。
如果不用 IFS 的话,还有一种方法可以得到上面第二种方法的效果:
代码如下:
#!/bin/sh
testfile=$1
x=`wc -l $testfile |awk ‘{print $1}‘`
i=1
while [ $i -le $x ]
do
echo ”`head -$i $testfile | tail -1`“
i=`expr $i + 1`
done
这篇文章主要介绍了Shell逐行读取文件的4种方法,本文介绍了while循环法、重定向法、管道法、文件描述符法等一些方法,需要的朋友可以参考下
在Linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法,为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率。
方法1:while循环中执行效率最高,最常用的方法。
代码如下:
function while_read_LINE_bottm{
While read LINE
do
echo $LINE
done < $FILENAME
}
注释:我习惯把这种方式叫做read釜底抽薪,因为这种方式在结束的时候需要执行文件,就好像是执行完的时候再把文件读进去一样。
方法2 : 重定向法;管道法: cat $FILENAME | while read LINE
代码如下:
Function While_read_LINE(){
cat $FILENAME | while read LINE
do
echo $LINE
done
}
注释:我只所有把这种方式叫做管道法,相比大家应该可以看出来了吧。当遇见管道的时候管道左边的命令的输出会作为管道右边命令的输入然后被输入出来。
方法3: 文件描述符法
代码如下:
Function while_read_line_fd(){
Exec 3<&0
Exec 0<$FILENAME
While read LINE
Do
Echo $LINE
Exec 0<&<3
}
注释: 这种方法分2步骤,第一,通过将所有内容重定向到文件描述符3来关闭文件描述符0.为此我们用了语法Exec 3<&0 。第二部将输入文件放送到文件描述符0,即标准输入。
方法4 for 循环。
代码如下:
function for_in_file(){
For i in `cat $FILENAME`
do
echo $i
done
}
注释:这种方式是通过for循环的方式来读取文件的内容相比大家很熟悉了,这里不多说。对各个方法进行测试,看那方法的执行效率最高。
首先我们用脚本(脚本见附件)生成一个70000行的文件,文件位置在/scripts/bigfile。然后通过下面的脚本来测试各个方法的执行效率,脚本很简单,不再解释。
代码如下:
#!/bin/bash
FILENAME=”$1“
TIMEFILE=”/tmp/loopfile.out“ >$TIMEFILE
SCRIPT=$(basename $0)
function usage(){
echo -e ”\nUSAGE: $SCRIPT. file \n“
exit 1
}
function while_read_bottm(){
while read LINE
do
echo $LINE
done < $FILENAME
}
function while_read_line(){
cat $FILENAME | while read LINE
do
echo $LINE
done
}
function while_read_line_fd(){
exec 3<&0
exec 0< $FILENAME
while read LINE
do
echo $LINE
done
exec 0<&3
}
function for_in_file(){
for i in `cat $FILENAME`
do
echo $i
done
}
if [ $# -lt 1 ] ; then
usage
fi
echo -e ” \n starting file processing of each method\n“
echo -e ”method 1:“
echo -e ”function while_read_bottm“
time while_read_bottm >>$TIMEFILE
echo -e ”\n“
echo -e ”method 2:“
echo -e ”function while_read_line “
time while_read_line >>$TIMEFILE
echo -e ”\n“
echo -e ”method 3:“
echo ”function while_read_line_fd“
time while_read_line_fd >>$TIMEFILE
echo -e ”\n“
echo -e ”method 4:“
echo -e ”function for_in_file"
time for_in_file >>$TIMEFILE
执行脚本后: [root@localhost shell]# ./while /scripts/bigfile
脚本输出内容:
代码如下:
method 1:
function while_read_bottm
real 0m5.689s
user 0m3.399s
sys 0m1.588s
method 2:
function while_read_line
real 0m11.612s
user 0m4.031s
sys 0m4.956s
method 3:
function while_read_line_fd
real 0m5.853s
user 0m3.536s
sys 0m1.469s
method 4:
function for_in_file
real 0m5.153s
user 0m3.335s
sys 0m1.593s
下面我们对各个方法按照速度进行排序,
代码如下:
real 0m5.153s method 4 (for 循环法)
real 0m5.689s method 1 (while 釜底抽薪法)
real 0m5.853s method 3 (标识符法)
real 0m11.612s method 2 (管道法)
由此可见在各个方法中,for语句效率最高,而在while循环中读写文件时,
代码如下:
while read LINE
do
echo $LINE
done < $FILENAME
方式执行效率最高。
这篇文章主要介绍了Shell实现读取ini格式配置文件方法,本文直接给出实现代码,需要的朋友可以参考下
ini文件格式一般都是由节、键、值三部分组成
格式:
[第一节 ]
第一个键 = 值
第二个键 = 第二个值
[第二节 ]
第一个键 = val1,val2,val3
例子:
代码如下:
[COM]
KINGGOO = jb51.net
其实这个作用没那么特别大,但多个shell如果每个配置信息都在shell文件里面写,懂的人还好,半懂+不仔细的人要如何改,改几个地方估计脚本就不能运行了,所以这样单独哪出来比较好些,而且可以多个shell使用一个ini文件(与扩展名无关)来做配置也可以的。只需要在shell里面加一个自定义函数就可以了。
代码如下:
# __readINI [配置文件路径+名称] [节点名] [键值]
function __readINI() {
INIFILE=$1; SECTION=$2; ITEM=$3
_readIni=`awk -F ‘=‘ ‘/\[‘$SECTION‘\]/{a=1}a==1&&$1~/‘$ITEM‘/{print $2;exit}‘ $INIFILE`
echo ${_readIni}
}
使用方法:
代码如下:
__readINI file.ini SECTION KEY
例子:有一个ini格式文件kinggoo.ini,内容如下
代码如下:
[IP]
ip = jb51.net
[MAILLIST]
mail = admin@jb51.net
脚本文件内容:
代码如下:
#!/bin/bash
# __readINI [配置文件路径+名称] [节点名] [键值]
function __readINI() {
INIFILE=$1; SECTION=$2; ITEM=$3
_readIni=`awk -F ‘=‘ ‘/\[‘$SECTION‘\]/{a=1}a==1&&$1~/‘$ITEM‘/{print $2;exit}‘ $INIFILE`
echo ${_readIni}
}
# 使用方法:
# Net address
_IP=( $( __readINI kinggoo.ini IP ip ) )
echo ${_IP}
# mail send
_mailList=( $( __readINI kinggoo.ini MAILLIST mail ) )
echo ${_mailList}
执行脚本文件既可
当自己使用时,请验证后使用,
如何在ghost win7中实现多个文件的同时重命名,其实这个技巧并不算是新鲜事了,属于windows操作中的一个小的实用技巧,喜欢使用快捷键操作方式的朋友,这个技巧可是千万不能遗漏的哦!
有的朋友在问,什么时候会用到这种技巧呢?其实,当我们保存文件的时候,如果是同一类型的文件,往往便会采用有规律的起名方式,例如说是云南旅行的照片,我们会命名为云南1、云南2、云南3,而丽江旅行的照片则会命名为丽江1、丽江2、丽江3,诸如此类有规则的命名方式,咱们就可以使用到同时命名的方法,要不然一个一个的去输入名字会十分的麻烦,
win7电脑中如何实现多个文件同时重命名?
,
小编就来介绍一下具体操作方法吧!
1.首先,咱们在保存文件的时候可以采用系统自动分配名字的方法,就是说保存的时候系统显示的什么名字,我们就让它默认为什么名字,这样的名字也不会重名,保存起来相当的快。
2.接下来,咱们选中文件夹中所有需要重命名的文件,直接按组合键ctrl+a就行,然后按F2,接下来输入自己希望设置的名字,系统便会在名字后自行分配数字了。
Mysql Error Code : 1436 Thread stack o
mysql 数据库基础笔记
linux mysql 安装与操作
mysql实现根据多个字段查找和置顶功能
超越MySQL 对流行数据库进行分支的知识小
关于mysql 的时间类型选择
详解mysql的limit经典用法及优化实例
mysql基础:mysqld_safe 启动执行流程详解
mysql 忘记密码的解决方法(linux和window
MYSQL索引建立需要注意以下几点细节
mysql安装图解 mysql图文安装教程
超详细mysql left join,right jo
Can''t connect to MySQL server
Mysql命令行导入sql数据
MYSQL 数据库导入导出命令
Mysql字符串截取函数SUBSTRING的
MySQL数据库备份与恢复方法
MySQL server has gone away 问题
windows下mysql忘记root密码的解
MySQL日期数据类型、时间类型使用
在工作中,我们时常会同时打开多个文档来进行对比或者编辑,但是一般的文档编辑软件默认情况下只能在一个窗口中打开,这该怎么办了?其实WPS文字中我们快速同时打开多个文档进行编辑。
一、WPS多文档标签
这个设计大家都应该很熟悉了,现在很多浏览器都是采用这样的设计,浏览器厂商考虑到加大在流量网页时,有可能同时打开多个网页,而这样的标签设计,就不会占用有限的任务栏空间了,WPS Office 2012同样为用户考虑得很周到,因为有了文档标签,你再也不用在拥挤的任务栏艰难的找寻文档了。
二、WPS文档位置随意换
在打开多个文档后,可能你需要的两个或多个文档并不没有挨在一起,来回的切换是不是让你头晕了,那快试试标签拖动吧,你只需在想要移动的标签上按住鼠标左键,然后就可以拖到你想要的位置了。
三、快速寻找标签
当打开的文档较多时,要快速的找到需要的文档就成了一件麻烦事,你可以通过标签右边的两个三角形按钮来左右移动标签的位置,一下一下的点很麻烦是吗?那快把鼠标放到标签栏上面吧,快速的滚动滑轮,标签也飞速的跑了起来。
四、WPS文字中快速批量操作
打开了多个文档进行编辑后,想要全部保存怎么办,想要全部关闭怎么办?别急,鼠标放在标签上点击右键看看,是不是有惊喜,除了保存和关闭全部文档,还可以关闭除了当前文档的其他所有文档。