0

I am currently working on a script that would delete blocks of lines with specific pattern from file1.txt and save the remaining on file2.txt. Below is the example of a file1.txt:

dn: fssecPermissionId=FSNASVIEW,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: FSNASVIEW
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_1

dn: fssecPermissionId=FSNASMANAGE,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: FSNASMANAGE
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_2

dn: fssecPermissionId=permission1,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission1
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_3

dn: fssecPermissionId=CMPlanManagementmonitor,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: CMPlanManagementmonitor
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_4

dn: fssecPermissionId=permission2,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission2
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_5

I would like to delete blocks with fssecPermissionId=FSNASVIEW, fssecPermissionId=FSNASMANAGE and fssecPermissionId=CMPlanManagementmonitor

Note that there are over 70 values of fssecPermissionId that i would like to delete, I just gave few examples for simplicity. I am thinking also that those 70 values would be stored somehow on an array but i have no idea how to.

Below is the expected output that will be saved to file2.txt

dn: fssecPermissionId=permission1,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission1
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_3

dn: fssecPermissionId=permission2,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission2
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_5

Thank you so much in advance for any help.

anubhava
  • 761,203
  • 64
  • 569
  • 643

2 Answers2

1

You can use awk with an empty RS:

awk -v RS= -v ORS='\n\n' '!/fssecPermissionId=(FSNASVIEW|FSNASMANAGE|CMPlanManagementmonitor)/' file

dn: fssecPermissionId=permission1,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission1
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_3

dn: fssecPermissionId=permission2,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission2
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_5

To save changes check: awk save modifications in place


EDIT: If you are dealing with a big list of exclusion patter then create a file called excl.txt with all the strings you want to exclude like this:

cat excl.txt
FSNASVIEW
FSNASMANAGE
CMPlanManagementmonitor

Then use this awk command:

awk -F, -v ORS='\n\n' 'NR==FNR {
   ex["dn: fssecPermissionId=" $1]
   next
}
!($1 in ex)' excl.txt RS= file

dn: fssecPermissionId=permission1,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission1
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_3

dn: fssecPermissionId=permission2,fsFragmentId=Permissions,fsFragmentId=Securi
 ty,fsClusterId=ClusterRoot
fssecPermissionId: permission2
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_5
anubhava
  • 761,203
  • 64
  • 569
  • 643
  • This will work if `fssecPermissionId` has only 3 values, however, in my real file, i have over 70 values of `fssecPermissionId` to delete. is there a way to restrict those 70 values using this code? – Nica Rivera Jun 15 '17 at 07:17
  • 1
    This definitely works! thank you so much for your help :) – Nica Rivera Jun 15 '17 at 07:35
0

file:

dn: fssecPermissionId=FSNASVIEW,fsFragmentId=Permissions,fsFragmentId=Security,fsClusterId=ClusterRoot
fssecPermissionId: FSNASVIEW
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_1

dn: fssecPermissionId=FSNASMANAGE,fsFragmentId=Permissions,fsFragmentId=Security,fsClusterId=ClusterRoot
fssecPermissionId: FSNASMANAGE
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_2

dn: fssecPermissionId=permission1,fsFragmentId=Permissions,fsFragmentId=Security,fsClusterId=ClusterRoot
fssecPermissionId: permission1
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_3

dn: fssecPermissionId=CMPlanManagementmonitor,fsFragmentId=Permissions,fsFragmentId=Security,fsClusterId=ClusterRoot
fssecPermissionId: CMPlanManagementmonitor
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_4

dn: fssecPermissionId=permission2,fsFragmentId=Permissions,fsFragmentId=Security,fsClusterId=ClusterRoot
fssecPermissionId: permission2
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_5

with sed:

sed -r /"fssecPermissionId=(FSNASVIEW|FSNASMANAGE|CMPlanManagementmonitor)"/,+4d file

output:

dn: fssecPermissionId=permission1,fsFragmentId=Permissions,fsFragmentId=Security,fsClusterId=ClusterRoot
fssecPermissionId: permission1
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_3

dn: fssecPermissionId=permission2,fsFragmentId=Permissions,fsFragmentId=Security,fsClusterId=ClusterRoot
fssecPermissionId: permission2
objectClass: FSSecPermission
fssecAssignedGroupRoleRef: group_5
tso
  • 4,732
  • 2
  • 22
  • 32
  • This will work if `fssecPermissionId` has only 3 values, however, in my real file, i have over 70 values of `fssecPermissionId` to delete. is there a way to restrict those 70 values using this code? – Nica Rivera Jun 15 '17 at 07:17