如何在unix或linux中基于sed,grep或awk获取unix目录中文件的名称?
我虽然可以做类似的事情:
for i in $(ls /tmp/files/date*); do
if [ $(cat $i | head -n 1 | grep -c "6") >= 1 ] ; then
echo $i
fi
done
我需要它来搜索某个目录中的所有文件(每个文件中只有第一行),然后返回哪些文件中包含字符串。
谢谢, 添
答案 0 :(得分:6)
您可以稍微简化脚本并获得所需的结果:
for i in /tmp/files/date*; do
if head -n 1 "$i" | grep -q "6"; then
basename "$i"
fi
done
答案 1 :(得分:2)
您的代码中存在许多问题。我会按照重要性的顺序或多或少地浏览它们。
then
:if [ $(cat $i | head -n 1 | grep -c "6" >= 1) ] ; then
ls
,全局就足够了:for i in /tmp/files/date*; do
>=
应该在子shell之外:if [ $(cat $i | head -n 1 | grep -c "6") >= 1 ] ; then
>=
应-ge
进行数字比较:if [ $(cat $i | head -n 1 | grep -c "6") -ge 1 ] ; then
"$i"
和子shell,您不需要引用6:if [ "$(cat "$i" | head -n 1 | grep -c 6)" -ge 1 ] ; then
grep
的返回值可用于控制if
(切换-c
至-q
,因为您希望它安静并且您不需要计数: if cat "$i" | head -n 1 | grep -q 6 ; then
if head -n 1 "$i" | grep -q 6 ; then
所以:
for i in /tmp/files/date*; do
if head -n 1 "$i" | grep -q 6 ; then
echo $i
fi
done
根据您要对列表执行的操作,您可能希望采用不同的方式(find
,可能)。
答案 2 :(得分:0)
您可以使用basename
获取路径的最后一部分(文件名)
$ basename '/usr/bin/env'
env
答案 3 :(得分:0)
“我需要它来搜索某个目录中的所有文件(每个目录中只有第一行),然后返回哪些文件中包含字符串。”
find,grep,cut的组合
find a_certain_directory_name -exec \grep -n -H -m 1 my_search_string {} \; | cut -f 1,2 -d : | grep -e ":1\$" | cut -f 1 -d :