shell 读取一个文件,要按一定格式截取并读取其值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 读取一个文件,要按一定格式截取并读取其值相关的知识,希望对你有一定的参考价值。

我要shell读取一个TXT文本(22.TXT)
逐行读取,注视忽略(#开头表示注视)
文本文件如此
#XSS跨站安全的URL特殊字符(配置项名称以"XSS_URL"开头)
XSS_URL_S1 = <
XSS_URL_S2 = >
XSS_URL_S3 = ;
XSS_URL_S4 = '
XSS_URL_S5 = javascript
XSS_URL_S6 = <script>
XSS_URL_S7 = \
#XSS跨站安全的输入框特殊字符(配置项名称以"XSS_INPUT"开头)
#系统不进行单个";"过滤,需组合对其进行过滤
XSS_INPUT_S1 = <
XSS_INPUT_S2 = >
XSS_INPUT_S3 = ;
XSS_INPUT_S4 = '
XSS_INPUT_S5 = javascript
XSS_INPUT_S6 = <script>
XSS_INPUT_S7 = \
XSS_INPUT_S8 = #
该文件是一个典型配置文件,
现在要处理的是按照规则截取=号后面的取值
要处理的结果就是类似和JAVA中的MAP值一样,一个key 对应一个value
XSS_INPUT_S1 的值是<

XSS_INPUT_S8 的值是#

也可以动态加入更多内容只是标示的下标会增加如:
XSS_INPUT_S9
XSS_INPUT_S10
...
XSS_INPUT_S100

求帮助
就是要将key和value分别取出来。
我是做java开发的, 如果用JAVA做的话。
是截取从0到=之前的为key
截取=到最后就是value

XSS_INPUT_S5 = javascript
在shell 中定义一个变量key
$key=XSS_INPUT_S5
$value= javascript
echo key
echo value
对,我是需要输出这样的结果,顺便求一个调用数据库查询的shell。
如果
XSS_INPUT_S9
。。。
XSS_INPUT_S100
这个文件是可以随时添加数据进去的。只是前缀都一样。后面下标会增加。
就是=号之前的和等号之后的数据分别取出来,不管以后添加多少数据进来。只要格式不变不用改shell脚本就可以读取出来变量名字和值

没太懂你什么意思,你要的是这样的结果吗?

参考技术A 1.shell中实现取key和value值很简单,参考 颜小宅_Syvn 的答案,
但是用shell想建立hash映射的话就很麻烦(用eval实现),建议用perl
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

#Establish hash
my $hash = ;
while (<>)

next if (/^#/);
if (/(.*?)\s+=\s+(.*)/)

my $key = $1;
my $value = $2;
$hash->$key = $value;



#Dump hash data
print "Output the hash:\n",Dumper($hash);

#test
print "if the key is XSS_INPUT_S5, it's value is ", $hash->'XSS_INPUT_S5';

2.关于调用数据库查询的shell,这个要看你使用的是什么数据库,比如用mysql
mysql -u’username’ -p’passwd‘ -D 'dbname' -e 'select * from tablename'
参考技术B 很简单。
sed -i -s 's/=/ /g' filename
key=`awk 'print $1' filename`
value=`awk 'print $2' filename`
参考技术C 需求没有说清楚,你是想做个批处理,实现在固定的配置文件中,根据参数指定的配置项名称(如XSS_INPUT_S9之类的),提取并显示其对应的值吗?追问

是的。就是将key 和value都分别取出来嘛。注释的行不做处理。

追答

取出来所有的KV对儿?还是取出来指定的某一对儿?取出后显示,还是怎么着?

追问

我只是说和key,value类似。
准确的说我只要输出 =之前的数据和=之后的数据分别取出来而已,就这么简单

追答

怎么就说不清楚呢?取出来所有的?还是根据过滤条件取出特定的某些个(例如只取出XSS_INPUT_S9这一个,或者取出以XSS_INPUT开头的一组,或者取出以XSS_URL开头的一组)?

追问

我需要输出
XSS_URL_S1
XSS_URL_S3 ;
XSS_URL_S4 '
XSS_URL_S5 javascript
但是这个文件里面的数据
我问题说明里面已经说的很清楚了。我要单独将=号之前的数据 和=之后的数据分别取出来。就这么简单。
但是这是一个配置文件=号之前的数据是带下标的。是可以增加或减少的。
其实也就是根据=号来截取前面和后面的数据而已。然后输出截取出来的数据。
怎么就没有说明白呢。

追答

那就是取出所有的,不要什么规则来取出感兴趣的,如下:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
FOR /F "Tokens=1,2 DELIMS==" %%A IN (test.txt) DO (
SET Line=%%A
SET Line=!Line:~0,1!
IF NOT !Line!==# ECHO %%A %%B
)
ENDLOCAL

以上是关于shell 读取一个文件,要按一定格式截取并读取其值的主要内容,如果未能解决你的问题,请参考以下文章

shell读取某个字段值? 怎么读

Shell编程字符截取命令cutprintf命令

PHP读取文件内容

在Ubuntu下编写shell脚本读取文件

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )